我想创建一个用于测试的选项列表。起初,我这样做:
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中,您无法做到
ArrayList<String> places = new ArrayList<String>( Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));
如前所述,您需要执行双括号初始化:
List<String> places = new ArrayList<String>() {{ add("x"); add("y"); }};
但这可能会迫使您添加注释@SuppressWarnings(“串行”)或生成一个令人讨厌的串行UUID。大多数代码格式化程序也会将其展开为多个语句/行。
或者你也可以这样做
List<String> places = Arrays.asList(new String[] {"x", "y" });
但您可能需要执行@SuppressWarnings(“未选中”)。
此外,根据javadoc,您应该能够做到这一点:
List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");
但我无法用JDK1.6编译它。
如果您只是将其声明为List,这会更简单——它必须是ArrayList吗?
List<String> places = Arrays.asList("Buenos Aires", "Córdoba", "La Plata");
或者如果您只有一个元素:
List<String> places = Collections.singletonList("Buenos Aires");
这意味着位置是不可变的(尝试更改它将导致引发UnsupportedOperationException异常)。
要创建一个可变列表,即一个具体的ArrayList,您可以从不可变列表中创建一个ArrayList:
ArrayList<String> places = new ArrayList<>(Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));
并导入正确的软件包:
import java.util.Arrays;
(应该是评论,但太长了,所以是新回复)。正如其他人所提到的,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))
这可能是实现这一点的最佳方式,特别是如果您需要无边界列表或需要使用继承。
实际上,初始化ArrayList的“最佳”方法可能是您编写的方法,因为它不需要以任何方式创建新的List:
ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
问题在于,引用该列表实例需要大量的输入。
还有其他方法,例如使用实例初始化器(也称为“双括号初始化”)创建匿名内部类:
ArrayList<String> list = new ArrayList<String>() {{
add("A");
add("B");
add("C");
}};
然而,我并不太喜欢这个方法,因为你最终得到的是ArrayList的一个子类,它有一个实例初始化器,而创建这个类只是为了创建一个对象——这在我看来有点过分。
如果Project Coin的Collection Literals提案被接受(它计划在Java 7中引入,但也不太可能是Java 8的一部分),那将是一件好事
List<String> list = ["A", "B", "C"];
不幸的是,它在这里对您没有帮助,因为它将初始化一个不可变的List,而不是ArrayList,此外,它还不可用,如果可能的话。