一行中ArrayList的java初始化
我想为测试目的创建一个选项列表。起初,我是这样做的:
ArrayList<String> places = new ArrayList<String>();
places.add("Buenos Aires");
places.add("Córdoba");
places.add("La Plata");
然后,我对代码进行了如下重构:
ArrayList<String> places = new ArrayList<String>(
Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));
有更好的方法吗
# 1 楼答案
如JEP 269: Convenience Factory Methods for Collections中所建议的java-9及以上版本,这可以通过使用集合文本实现,现在使用-
类似的方法也适用于{}
这类似于@coobird所说的Collection Literals proposal。JEP中也进一步澄清了-
备选方案
相关:What is the point of overloaded Convenience Factory Methods for Collections in Java 9
# 2 楼答案
如果您只是将它声明为
List
会更简单-它必须是ArrayList吗或者,如果只有一个元素:
这意味着
places
是不可变的(尝试更改它将导致引发UnsupportedOperationException
异常)要创建一个具体的
ArrayList
可变列表,您可以从不可变列表创建一个ArrayList
:# 3 楼答案
简单的答案
Java 10或更高版本:
这将为您提供一个不可变的
List
,因此它无法更改在大多数情况下,在预填充时,这就是您想要的
爪哇9
如果您使用的是Java9,则不能使用
var
关键字:Java 8或更早版本:
这将为您提供一个由数组支持的,所以它仍然是可变的
List
*,因此它不能更改长度但是你可以调用^{
* 实现细节:它是
java.util.Arrays
内的一个私有嵌套类,名为ArrayList
,它与
java.util.ArrayList
是不同的类,尽管它们的简单名称相同静态导入
您可以通过静态导入使Java 8
Arrays.asList
更短:任何现代IDE*都会为您提供建议和帮助
我不建议静态地将
List.of
方法作为of
导入,因为它很混乱* 例如,在IntelliJ IDEA中,按
Alt+Enter
并选择Static import method...
使用
Stream
s为什么它必须是
List
对于Java 8或更高版本,您可以使用更灵活的
Stream
:您可以连接
Stream
s:或者您可以从
Stream
转到List
:但最好只使用
Stream
而不将其收集到List
如果您特别需要
java.util.ArrayList
*如果您想同时预填充
ArrayList
和之后添加到它,请使用或在Java 8或更早版本中:
或使用
^{10}pr$Stream
:但是再次强调,最好直接使用
Stream
,而不是将其收集到List
*您可能不需要特定的
ArrayList
。引用JEP 269:(强调矿山)
程序到接口,而不是实现
您说过您已经在代码中将列表声明为
ArrayList
,但只有当您使用的是ArrayList
中不在List
中的某个成员时,才应该这样做而你很可能不会这么做
通常,您应该通过将要使用的最通用的接口(例如
Iterable
、Collection
或List
)声明变量,并使用特定的实现(例如ArrayList
、LinkedList
或Arrays.asList()
)初始化它们否则,您会将代码限制为该特定类型,并且在需要时很难进行更改
例如,如果要将
ArrayList
传递给void method(...)
:另一个例子是总是将变量声明为
InputStream
,即使它通常是FileInputStream
或BufferedInputStream
,因为不久的将来您或其他人会想使用其他类型的InputStream
# 4 楼答案
实际上,初始化
ArrayList
的“最佳”方法可能是您编写的方法,因为它不需要以任何方式创建新的List
:需要注意的是,引用
list
实例需要大量的键入还有其他选择,例如使用实例初始值设定项创建匿名内部类(也称为“双大括号初始化”):
但是,我不太喜欢这个方法,因为最终得到的是
ArrayList
的一个子类,它有一个实例初始值设定项,而创建这个类只是为了创建一个对象——这对我来说似乎有点过分了如果Project Coin的Collection Literals proposal被接受(计划在Java 7中引入,但也不太可能成为Java 8的一部分),那就好了:
不幸的是,它在这里对您没有帮助,因为它将初始化一个不可变的
List
,而不是一个ArrayList
,而且,如果可能的话,它还不可用# 5 楼答案
使用Guava可以编写:
在Guava中还有其他有用的静态构造函数。你可以阅读关于他们的here
# 6 楼答案
如果您需要大小为1的简单列表:
如果需要多个对象的列表: