我想创建一个用于测试的选项列表。起初,我这样做:
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"));
有更好的方法吗?
在Java 9中,我们可以很容易地在一行中初始化ArrayList:
List<String> places = List.of("Buenos Aires", "Córdoba", "La Plata");
or
List<String> places = new ArrayList<>(List.of("Buenos Aires", "Córdoba", "La Plata"));
Java 9的这种新方法与以前的方法相比有许多优点:
空间效率不可变性线程安全
有关更多详细信息,请参阅本文->List.of和Arrays.asList之间的区别是什么?
(应该是评论,但太长了,所以是新回复)。正如其他人所提到的,Arrays.asList方法是固定大小的,但这并不是它唯一的问题。它也不能很好地处理继承。例如,假设您有以下内容:
class A{}
class B extends A{}
public List<A> getAList(){
return Arrays.asList(new B());
}
上述结果导致编译器错误,因为List<B>(这是Arrays.asList返回的)不是List<a>的子类,即使您可以将类型B的object添加到List<a>object。要解决此问题,您需要执行以下操作:
new ArrayList<A>(Arrays.<A>asList(b1, b2, b3))
这可能是实现这一点的最佳方式,特别是如果您需要无边界列表或需要使用继承。