如何将数组转换为Java中的列表?
我使用了EDCOX1(0),但是行为(和签名)从Java SE 1.4.2(文档中现在的文档)变成了8,在Web上发现的大多数片段使用了1.4.2的行为。
例如:
1 2
int [ ] spam
= new int [ ] { 1 ,
2 ,
3 } ;
Arrays .
asList ( spam
)
在1.4.2上返回包含元素1、2、3的列表
在1.5.0+上返回包含数组垃圾邮件的列表
在许多情况下,它应该很容易被检测到,但有时它会在不被注意的情况下滑动:
1
Assert .
assertTrue ( Arrays .
asList ( spam
) .
indexOf ( 4 ) == - 1 ) ;
我认为你的例子被打破了:EDCOX1(0);绝对没有在Java1.4.2中编译,因为EDCOX1×1 }不是EDCOX1×2。
哦,你可能是对的。在发布之前,我没有Java1.4.2编译器来测试我的示例。现在,在你的评论和乔的回答之后,一切都变得更有意义了。
我认为Autoboxing应该包括从原始类到包装整数类的转换。您可以先自己进行强制转换,然后使用上面的Arrays.asList 代码。
Java 8的流.BOXDE()将负责自动装箱,并可用于此。请看下面我的答案。
Java 8解决方案:StAdppOrth.COM/问题/ 2607289/& Helip;
Java 9解决方案,但返回的列表是不可变的:DOCS.Oracle .COM/JavaSe/ 9 /DOCS/API/Java/UTL/List.html HTML of E.‌& 8203;
在您的示例中,这是因为您不能拥有基元类型的列表。换句话说,List 是不可能的。
但是,您可以使用包装int 原语的Integer 类来拥有List 。使用Arrays.asList 实用方法将数组转换为List 。
请参阅ideone.com上的"实时运行"代码。
或者更简单:array.aslist(1,2,3);
它怎么知道不创建一个List ?
在Java 5 +中失败。
@thomasahle它不会创建一个list它会创建一个list对象。如果你想保证类型安全,你可以写:array.aslist(spam);
@用户1712376我只是说,很奇怪。如果我想创建一个Long x 的列表,我会创建Arrays.asList(x) 。如果我想创建一个Long[] x2 的列表,我会创建Arrays.asList(x2) ,但现在我不确定我会得到什么……
@thomasahle可以以array.aslist 0或更多元素的形式传递,可以是逗号分隔格式,也可以是任意格式的数组。结果总是一样的-一个你指定的元素列表。这是由于方法签名:public staticlistaslist(t…A)在这里,您可以阅读更多关于VARARGS DOCS.Oracle COM/Javase/Tudio/Java/javao//Helip;
@这是个好问题。猜测它只是Java编译器中的一个规则。例如,下面的代码返回一个列表Integer[] integerArray1 = { 1 }; Integer[] integerArray2 = { 2 }; List integerArrays = Arrays.asList(integerArray1, integerArray2); 。
是的,似乎有一个特殊的规则来检测单个数组的传递时间。我想知道Arrays.asList(spam); 是否会给出编译错误?
对于我来说,如果使用基元类型数组,则失败。即INT[]。结果是list
我有"double[]observations",做"array.aslist(observations)"返回"list",这显然不是我需要的!
@它不适用于原始数组,如int[] 、long[] 、double[] ,只适用于Integer[] 、long[] 、double[] …
@完全除霜,问题是对于基元数组int[]
.aslist()数组方法返回arraylist。方法接受基元类型的变量参数。因为只有基元数据类型可以用作集合的泛型,这就解释了编译时失败的原因。
记住,arrays.aslist()返回数组$arraylist,它是固定大小的列表,并保持对原始数组的引用。它提供了一个API,通过list的方法与实际数组一起工作。
在Java 8中,可以使用流:
1 2 3 4
int [ ] spam
= new int [ ] { 1 ,
2 ,
3 } ;
Arrays .
stream ( spam
)
.
boxed ( )
.
collect ( Collectors.
toList ( ) ) ;
说到转换方式,这取决于你为什么需要你的List 。如果你需要它只是为了读取数据。好的,给你:
1 2
Integer [ ] values
= { 1 ,
3 ,
7 } ;
List
< Integer
> list
= Arrays .
asList ( values
) ;
但是如果你这样做:
你得到了java.lang.UnsupportedOperationException 。因此,在某些情况下,您甚至需要:
1 2
Integer [ ] values
= { 1 ,
3 ,
7 } ;
List
< Integer
> list
= new ArrayList
< Integer
> ( Arrays .
asList ( values
) ) ;
第一种方法实际上不转换数组,而是像List 那样"表示"数组。但数组的所有属性都像固定数目的元素一样,是在其幕后进行的。请注意,在构造ArrayList 时需要指定类型。
"不变"让我困惑了一会儿。显然,您可以更改数组的值。但是,您不能更改其大小。
问题是varargs是在java5中引入的,不幸的是,Arrays.asList() 也被vararg版本过载了。因此,java5编译器将Arrays.asList(spam) 理解为int数组的vararg参数。
这个问题在更详细的Java第二ED中解释,第7章,第42项。
我知道发生了什么,但不知道为什么没有记录下来。我正在寻找一个没有重新实现轮子的替代解决方案。
有什么工作吗?
@ Java 8的UsMaSISmail,我们可以使用流来进行转换。请看下面我的答案。
似乎有点晚了,但这是我的两分钱。我们不能有List ,因为int 是原始类型,所以我们只能有List 。
Java 8(int数组)
1 2
int [ ] ints
= new int [ ] { 1 ,
2 ,
3 ,
4 ,
5 } ;
List
< Integer
> list11
= Arrays .
stream ( ints
) .
boxed ( ) .
collect ( Collectors.
toList ( ) ) ;
Java 8及以下(整数数组)
1 2 3 4
Integer [ ] integers
= new Integer [ ] { 1 ,
2 ,
3 ,
4 ,
5 } ;
List
< Integer
> list21
= Arrays .
asList ( integers
) ; // returns a fixed-size list backed by the specified array.
List
< Integer
> list22
= new ArrayList
<> ( Arrays .
asList ( integers
) ) ; // good
List
< Integer
> list23
= Arrays .
stream ( integers
) .
collect ( Collectors.
toList ( ) ) ; //Java 8 only
需要数组列表而不是列表?
如果我们想要具体实施List ,例如ArrayList ,那么我们可以使用toCollection 作为:
1 2
ArrayList
< Integer
> list24
= Arrays .
stream ( integers
)
.
collect ( Collectors.
toCollection ( ArrayList :: new ) ) ;
为什么list21 不能进行结构修改?
当我们使用Arrays.asList 时,返回列表的大小是固定的,因为返回的列表不是java.util.ArrayList ,而是在java.util.Arrays 中定义的私有静态类。因此,如果我们从返回的列表中添加或删除元素,将抛出一个UnsupportedOperationException 。因此,当我们想要修改列表时,我们应该使用list22 。如果我们有java8,那么我们也可以使用list23 。
显然,可以从我们可以称为list21.set(index,element) 的意义上修改list21 ,但是这个列表可能不会在结构上被修改,即不能从列表中添加或删除元素。你也可以检查这个问题。
如果我们想要一个不变的列表,那么我们可以将其包装为:
另一点需要注意的是,方法Collections.unmodifiableList 返回指定列表的不可修改视图。不可修改的视图集合是不可修改的集合,也是支持集合上的视图。请注意,对支持集合的更改可能仍然是可能的,如果发生更改,则可以通过不可修改的视图看到这些更改。
我们可以在Java 10中拥有一个真正不可变的列表。
Java 10(真正不变的列表)有两种方式:
List.copyOf(Arrays.asList(integers))
Arrays.stream(integers).collect(Collectors.toUnmodifiableList());
还要查看我的这个答案了解更多信息。
在您的代码示例中,Arrays.asList 表示// Cannot modify returned list 的注释不正确。List 是可修改的,并且实际将更改写回数组。参见Arrays.asList 类文档。也许你在想江户记1〔4〕。
@我的意思是巴西尔布尔克不能通过添加/删除来修改列表的结构,但是可以更改元素。
实际上,我尝试了一些代码,并确认调用List::add 和List::remove 失败,Arrays.asList 返回了一个列表。该方法的JavaDoc在这一点上写得不好,也不清楚。在我的第三次阅读中,我认为短语"固定大小"是指不能添加或删除元素。
我最近不得不把一个数组转换成一个列表。稍后,程序过滤了试图删除数据的列表。使用array.aslist(array)函数时,将创建一个固定大小的集合:既不能添加也不能删除。这个条目比我能更好地解释这个问题:当我试图从列表中删除元素时,为什么会得到一个不受支持的操作异常?.
最后,我不得不进行"手动"转换:
1 2 3 4
List< ListItem> items = new ArrayList< ListItem> ( ) ;
for ( ListItem item: itemsArray) {
items.add ( item) ;
}
我想我可以使用list.addall(items)操作添加从数组到列表的转换。
new ArrayList(Arrays.asList(itemsArray)) 也会这样
@布莱德祖胡:当然,上面的答案并不能解决我使用固定大小数组的问题,但是你在这里基本上说的是RTFM,这是一种糟糕的形式。请详细说明答案有什么问题,或者不必评论。
检查工具可能会在这里显示警告,您已经说出了原因。不需要手动复制元素,而是使用Collections.addAll(items, itemsArray) 。
只是碰到这个例外。恐怕马可13的回答应该是正确的。我可能需要浏览全年代码来修复所有"aslist"异常。
更短:
1
List
< Integer
> list
= Arrays .
asList ( 1 ,
2 ,
3 ,
4 ) ;
使用数组
这是将数组转换为List 的最简单方法。但是,如果您试图添加一个新元素或从列表中删除一个现有元素,那么将抛出一个UnsupportedOperationException 。
1 2 3 4 5 6 7
Integer [ ] existingArray
= { 1 ,
2 ,
3 } ;
List
< Integer
> list1
= Arrays .
asList ( existingArray
) ;
List
< Integer
> list2
= Arrays .
asList ( 1 ,
2 ,
3 ) ;
// WARNING:
list2.
add ( 1 ) ; // Unsupported operation!
list2.
remove ( 1 ) ; // Unsupported operation!
使用arraylist或其他列表实现
可以使用for 循环将数组的所有元素添加到List 实现中,例如ArrayList :
1 2 3 4
List< Integer> list = new ArrayList<> ( ) ;
for ( int i : new int [ ] { 1 , 2 , 3 } ) {
list.add ( i) ;
}
在Java 8中使用流API
您可以将数组转换为流,然后使用不同的收集器收集流:Java 8中的默认收集器使用EDOCX1 OR 4在屏幕后面,但也可以强行添加首选项实现。
1 2 3 4
List
< Integer
> list1, list2, list3
;
list1
= Stream.
of ( 1 ,
2 ,
3 ) .
collect ( Collectors.
toList ( ) ) ;
list2
= Stream.
of ( 1 ,
2 ,
3 ) .
collect ( Collectors.
toCollection ( ArrayList :: new ) ) ;
list3
= Stream.
of ( 1 ,
2 ,
3 ) .
collect ( Collectors.
toCollection ( LinkedList :: new ) ) ;
参见:
为什么我们在Java中使用自动装箱和解包?
何时在ArrayList上使用LinkedList?
如果你的目标是Java 8(或更高版本),你可以尝试:
1 2 3
int [ ] numbers
= new int [ ] { 1 ,
2 ,
3 ,
4 } ;
List
< Integer
> integers
= Arrays .
stream ( numbers
)
.
boxed ( ) .
collect ( Collectors.
< Integer
> toList
( ) ) ;
注:
注意Collectors.toList() ,这个通用方法有助于避免错误"类型不匹配:不能从List 转换为List "。
如果使用ApacheCommonsLang,另一个解决方法是:
1 2
int [ ] spam
= new int [ ] { 1 ,
2 ,
3 } ;
Arrays .
asList ( ArrayUtils.
toObject ( spam
) ) ;
其中arrayutils.toobject将int[] 转换为Integer[] 。
在Java 9中,通过新的便利工厂方法List.of :使用更可变列表的更优雅的解决方案:
1
List
< String
> immutableList
= List .
of ( "one" ,
"two" ,
"three" ) ;
(无耻地从这里抄袭)
仅供参考,要了解这背后的一些技术细节,请参阅jep 269:收集的便利工厂方法和主要作者stuart marks的演讲。
番石榴:
1 2
Integer [ ] array
= { 1 ,
2 ,
3 } ;
List
< Integer
> list
= Lists.
newArrayList ( sourceArray
) ;
使用Apache Commons集合:
1 2 3
Integer [ ] array
= { 1 ,
2 ,
3 } ;
List
< Integer
> list
= new ArrayList
<> ( 6 ) ;
CollectionUtils.
addAll ( list, array
) ;
你必须加入到数组中
Java:不兼容类型:INT[]不能转换为java.
@然后将dValue强制转换为int[]。重要的部分是投射到数组中。
一班轮:
所以这取决于你尝试的Java版本。
爪哇7
或
1 2 3 4 5 6 7 8 9 10 11
final String arr
[ ] = new String [ ] { "G" ,
"E" ,
"E" ,
"K" } ;
final List
< String
> initialList
= new ArrayList
< String
> ( ) { {
add
( "C" ) ;
add
( "O" ) ;
add
( "D" ) ;
add
( "I" ) ;
add
( "N" ) ;
} } ;
// Elements of the array are appended at the end
Collections .
addAll ( initialList, arr
) ;
或
在Java 8中
1 2 3
int [ ] num
= new int [ ] { 1 ,
2 ,
3 } ;
List
< Integer
> list
= Arrays .
stream ( num
)
.
boxed ( ) .
collect ( Collectors.
< Integer
> toList
( ) )
参考-http://www.codingek.com/java/how-to-convert-array-to-list-in-java/
如果这样有帮助:我遇到了同样的问题,只写了一个通用函数,它接受一个数组并返回具有相同内容的相同类型的arraylist:
1 2 3 4 5
public static < T> ArrayList< T> ArrayToArrayList( T[ ] array) {
ArrayList< T> list = new ArrayList< T> ( ) ;
for ( T elmt : array) list.add ( elmt) ;
return list;
}
如果在整数值中使用数组,请使用两行代码将其转换为列表必须对基元数据类型使用Autoboxing类型