如何将数组转换为Java中的列表?
我使用了 Arrays.asList()
但行为(和签名)以某种方式从Java SE 1.4.2(现在存档中的文档)更改为8,我在网上找到的大多数片段都使用1.4.2行为 .
例如:
int[] spam = new int[] { 1, 2, 3 };
Arrays.asList(spam)
-
on 1.4.2返回包含元素1,2,3的列表
-
on 1.5.0返回包含阵列垃圾邮件的列表
在许多情况下,它应该很容易被发现,但有时它可能会被忽视:
Assert.assertTrue(Arrays.asList(spam).indexOf(4) == -1);
17 回答
如果在整数值中使用它,则使用两行代码将数组转换为列表,必须对原始数据类型使用自动装箱类型
我最近不得不将数组转换为List . 稍后程序过滤了试图删除数据的列表 . 使用Arrays.asList(array)函数时,可以创建固定大小的集合:既不能添加也不能删除 . 此条目比我更好地解释了问题:Why do I get an UnsupportedOperationException when trying to remove an element from a List? .
最后,我不得不进行“手动”转换:
我想我可以使用List.addAll(items)操作添加从数组到列表的转换 .
如果您的目标是Java 8(或更高版本),可以试试这个:
注意:
注意
Collectors.<Integer>toList()
,这种通用方法可以帮助您避免错误“类型不匹配:无法从List<Object>
转换为List<Integer>
” .如果你使用apache commons-lang,另一个解决方法:
ArrayUtils.toObject将
int[]
转换为Integer[]
在Java 8中,您可以使用流:
问题是varargs是在Java5中引入的,不幸的是,
Arrays.asList()
也因为vararg版本而过载 . 所以Arrays.asList(spam)
被Java5编译器理解为int数组的vararg参数 .在Effective Java 2nd Ed . ,第7章,第42项中更详细地解释了这个问题 .
这似乎不太晚,但这是我的两分钱 . 我们不能
List<int>
因为int
是原始类型所以我们只能List<Integer>
.Java 8(int数组)
Java 8及以下版本(整数数组)
需要ArrayList而不是List吗?
如果我们想要
List
的具体实现,例如ArrayList
然后我们可以使用toCollection
作为:Why list21 cannot be structurally modified?
当我们使用
Arrays.asList
时,返回列表的大小是固定的,因为返回的列表不是java.util.ArrayList
,而是java.util.Arrays
中定义的私有静态类 . 因此,如果我们在返回的列表中添加或删除元素,则会抛出UnsupportedOperationException
. 因此,当我们想要修改列表时,我们应该使用list22
. 如果我们有Java8,那么我们也可以使用list23
.要清楚
list21
可以在我们可以调用list21.set(index,element)
的意义上进行修改,但是这个列表可能没有结构修改,即无法在列表中添加或删除元素 . 您也可以查看question .如果我们想要一个不可变列表,那么我们可以将其包装为:
另一点需要注意的是,方法
Collections.unmodifiableList
返回指定列表的不可修改视图 . 不可修改的视图集合是一个不可修改的集合,也是一个支持集合的视图 . 请注意,可能仍然可以对支持集合进行更改,如果它们发生,则通过不可修改的视图可以看到它们 .我们可以在Java 10中拥有一个真正不可变的列表 .
Java 10(真正不变的列表)有两种方式:
List.copyOf(Arrays.asList(integers))
Arrays.stream(integers).collect(Collectors.toUnmodifiableList());
另请查看我的answer以获取更多信息 .
使用数组
这是将数组转换为
List
的最简单方法 . 但是,如果您尝试添加新元素或从列表中删除现有元素,则会抛出UnsupportedOperationException
.使用ArrayList或其他列表实现
您可以使用
for
循环将数组的所有元素添加到List
实现中,例如ArrayList
:在Java 8中使用Stream API
您可以将数组转换为流,然后使用不同的收集器收集流:Java 8中的默认收集器在屏幕后面使用
ArrayList
,但您也可以强制执行首选实现 .也可以看看:
Why do we use autoboxing and unboxing in Java?
When to use LinkedList over ArrayList?
谈到转换方式,这取决于你为什么需要
List
. 如果你需要它只是为了读取数据 . 好的,你走了:但是如果你做这样的事情:
你得到
java.lang.UnsupportedOperationException
. 所以在某些情况下你甚至需要这个:第一种方法实际上不转换数组,但'represents'它就像
List
. 但是数组在其内部具有所有属性,例如固定数量的元素 . 请注意,在构造ArrayList
时需要指定类型 .一内胆:
在Java 9中,您可以通过新的便捷工厂方法List.of获得更加优雅的使用不可变列表的解决方案:
(从here无耻地复制)
更短:
在您的示例中,这是因为您不能拥有List原始类型 . 换句话说,
List<int>
是不可能的 . 但是,您可以拥有List<Integer>
.这按预期工作 .
你必须投射到数组
所以它取决于你正在尝试的Java版本 -
Java 7
要么
要么
在Java 8中
Reference - http://www.codingeek.com/java/how-to-convert-array-to-list-in-java/
如果这有帮助:我遇到了同样的问题,只是写了一个通用函数,它接受一个数组并返回一个具有相同内容的相同类型的ArrayList: