(旧线程,但只有 2 美分,因为没有提到 Guava 或其他库以及其他一些细节)
如果可以,请使用番石榴
值得指出的是 Guava 方式,它极大地简化了这些恶作剧:
用法
对于不可变列表
使用ImmutableList类及其of()和copyOf()工厂方法(元素不能为空):
List<String> il = ImmutableList.of("string", "elements"); // from varargs
List<String> il = ImmutableList.copyOf(aStringArray); // from array
对于可变列表
使用Lists 类及其newArrayList() 工厂方法:
List<String> l1 = Lists.newArrayList(anotherListOrCollection); // from collection
List<String> l2 = Lists.newArrayList(aStringArray); // from array
List<String> l3 = Lists.newArrayList("or", "string", "elements"); // from varargs
请注意其他类中其他数据结构的类似方法,例如Sets。
主要的吸引力可能是减少由于类型安全泛型导致的混乱,因为使用 Guava factory methods 允许在大多数时间推断类型。然而,自从 Java 7 推出了新的菱形运算符以来,这个论点就站不住脚了。
但这并不是唯一的原因(Java 7 还不是无处不在):速记语法也非常方便,方法初始化器(如上所示)允许编写更具表现力的代码。您在一个 Guava 调用中完成了当前 Java 集合需要 2 的操作。
如果你不能...
对于不可变列表
使用 JDK 的 Arrays 类及其 asList() 工厂方法,用 Collections.unmodifiableList() 包装:
List<String> l1 = Collections.unmodifiableList(Arrays.asList(anArrayOfElements));
List<String> l2 = Collections.unmodifiableList(Arrays.asList("element1", "element2"));
请注意,asList() 的返回类型是使用具体的ArrayList 实现的List,但它不是 java.util.ArrayList。它是一种内部类型,它模拟 ArrayList 但实际上直接引用传递的数组并使其“直写”(修改反映在数组中)。
它禁止通过简单地扩展AbstractList 的方式通过List API 的某些方法进行修改(因此,不支持添加或删除元素),但是它允许调用set() 来覆盖元素。因此,这个列表并不是真正不可变的,对asList() 的调用应该用Collections.unmodifiableList() 包装。
如果您需要可变列表,请参阅下一步。
对于可变列表
与上面相同,但用实际的 java.util.ArrayList 包裹:
List<String> l1 = new ArrayList<String>(Arrays.asList(array)); // Java 1.5 to 1.6
List<String> l1b = new ArrayList<>(Arrays.asList(array)); // Java 1.7+
List<String> l2 = new ArrayList<String>(Arrays.asList("a", "b")); // Java 1.5 to 1.6
List<String> l2b = new ArrayList<>(Arrays.asList("a", "b")); // Java 1.7+
出于教育目的:良好的手动方式
// for Java 1.5+
static <T> List<T> arrayToList(final T[] array) {
final List<T> l = new ArrayList<T>(array.length);
for (final T s : array) {
l.add(s);
}
return (l);
}
// for Java < 1.5 (no generics, no compile-time type-safety, boo!)
static List arrayToList(final Object[] array) {
final List l = new ArrayList(array.length);
for (int i = 0; i < array.length; i++) {
l.add(array[i]);
}
return (l);
}