我有一个初始化的数组,如:
Element[] array = {new Element(1), new Element(2), new Element(3)};
我想将此数组转换为ArrayList类的对象。
ArrayList<Element> arraylist = ???;
我有一个初始化的数组,如:
Element[] array = {new Element(1), new Element(2), new Element(3)};
我想将此数组转换为ArrayList类的对象。
ArrayList<Element> arraylist = ???;
new ArrayList<>(Arrays.asList(array))
鉴于:
Element[] array = new Element[] { new Element(1), new Element(2), new Element(3) };
最简单的答案是:
List<Element> list = Arrays.asList(array);
这样可以正常工作。但有些警告:
ArrayList
。否则你会得到一个 UnsupportedOperationException
。asList()
由原始数组支持。如果修改原始数组,则也会修改列表。这可能是令人惊讶的。 (旧线程,但只有2美分,因为没有提到番石榴或其他图书馆和其他一些细节)
值得指出的是Guava方式,它极大地简化了这些恶作剧:
使用 ImmutableList
阶级及其 of()
和 copyOf()
工厂方法 (元素不能为null):
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
。
使用番石榴时,主要的吸引力可能是减少因类型安全的仿制品而造成的混乱 工厂方法 允许在大多数时间推断类型。然而,自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()
是一个 List
使用混凝土 ArrayList
实施,但 不是这样 java.util.ArrayList
。它是一种内部类型,它模仿一个 ArrayList
但实际上直接引用传递的数组并使其“直写”(修改反映在数组中)。
它禁止通过一些修改 List
API的方法只需简单地扩展一个 AbstractList
(因此,不支持添加或删除元素),但它允许调用 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);
}
由于这个问题已经很老了,令我惊讶的是没有人提出最简单的形式:
List<Element> arraylist = Arrays.asList(new Element(1), new Element(2), new Element(3));
从Java 5开始, Arrays.asList()
采用varargs参数,您不必显式构造数组。
new ArrayList<T>(Arrays.asList(myArray));
确保这一点 myArray
与...类型相同 T
。如果您尝试创建一个,则会出现编译器错误 List<Integer>
从一个数组 int
, 例如。
另一种方式(虽然基本上相当于 new ArrayList(Arrays.asList(array))
解决方案性能方面:
Collections.addAll(arraylist, array);
您可能只需要一个List,而不是ArrayList。在这种情况下,您可以这样做:
List<Element> arraylist = Arrays.asList(array);
在 Java 9, 您可以使用 List.of
静态工厂方法,以创建一个 List
文字。类似于以下内容:
List<Element> elements = List.of(new Element(1), new Element(2), new Element(3));
这将返回一个 一成不变 列表包含三个元素。如果你想要一个 易变的 列表,将该列表传递给 ArrayList
构造函数:
new ArrayList<>(List.of(// elements vararg))
JEP 269 提供一些方便的工厂方法 Java集合 API。这些不可变的静态工厂方法内置于 List
, Set
,和 Map
Java 9及更高版本中的接口。
另一个更新,即将结束的2014年,您也可以使用Java 8:
ArrayList<Element> arrayList = Stream.of(myArray).collect(Collectors.toCollection(ArrayList::new));
如果这可能只是一个字符,则会保存一些字符 List
List<Element> list = Stream.of(myArray).collect(Collectors.toList());
要将数组转换为ArrayList,开发人员通常会这样做:
List<String> list = Arrays.asList(arr);// this is wrong way..
Arrays.asList()
将返回一个ArrayList,它是一个 private static class inside Arrays
,它不是java.util.ArrayList类。 The java.util.Arrays.ArrayList
上课了 set(), get(), contains()
方法,但没有任何添加元素的方法,所以它的大小是固定的。
要创建一个真正的ArrayList,您必须:
ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(arr));
ArrayList的构造函数可以接受 收集类型,这也是一种超级类型 java.util.Arrays.ArrayList