有没有更好的方法来实现这一目标?
public static List<String> toList(String[] array) {
List<String> list = new ArrayList(array.length);
for(int i=0; i<array.length; i++)
list.add(array[i]);
return list;
}
注意: Arrays.asList(a)返回由指定数组支持的固定大小的列表。 (对返回列表的更改“直写”到数组。)。我不希望这种行为。我认为上面的MY函数会绕过那个(或者我错了吗?)
所以,我们在这里有另一种方法:
public static List<String> toList(String[] array) {
List<String> list = new ArrayList(array.length);
list.addAll(Arrays.asList(array));
return list;
}
只是看着它,我不相信它比第一种方法更快。
答案 0 :(得分:36)
你用更好的方式是什么意思:
更具可读性:
List<String> list = new ArrayList<String>(Arrays.asList(array));
减少内存消耗,可能更快(但绝对不是线程安全):
public static List<String> toList(String[] array) {
if (array==null) {
return new ArrayList(0);
} else {
int size = array.length;
List<String> list = new ArrayList(size);
for(int i = 0; i < size; i++) {
list.add(array[i]);
}
return list;
}
}
顺便说一句:这是你的第一个例子中的错误:
如果array为null, array.length
将引发空指针异常,因此必须先检查if (array!=null)
。
答案 1 :(得分:28)
Arrays.asList(array);
示例:
List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");
请参阅Arrays.asList
课程文档。
答案 2 :(得分:17)
Arrays.asList(array)
Arrays
使用new ArrayList(array)
。但这不是java.util.ArrayList
。但它非常相似。请注意,此构造函数接受数组并将其作为列表的后备数组。所以它是O(1)
。
如果您已经创建了列表Collections.addAll(list, array)
,但效率较低。
更新:因此,Collections.addAll(list, array)
成为一个不错的选择。它的包装是番石榴Lists.newArrayList(array)
。
答案 3 :(得分:13)
另一种方法:
Collections.addAll(collectionInstance,array);
答案 4 :(得分:7)
怎么样:
List myList = new ArrayList();
String[] myStringArray = new String[] {"Java", "is", "Cool"};
Collections.addAll(myList, myStringArray);
答案 5 :(得分:5)
您可以使用:
list.addAll(Arrays.asList(array));
答案 6 :(得分:2)
您可以尝试这样的事情:
List<String> list = new ArrayList<String>(Arrays.asList(array));
public ArrayList(Collection c)
构造一个包含的列表 指定集合的元素, 按照它们返回的顺序 集合的迭代器。 ArrayList 实例的初始容量为 110%的指定大小 集合。
取自here
答案 7 :(得分:1)
你检查过Arrays.asList()
;见API
答案 8 :(得分:1)
是的,有。您可以使用java.util。*包中的Arrays类。然后它实际上只是一行代码。
List<String> list = Arrays.asList(array);
答案 9 :(得分:1)
您可以使用 List.of(array)
获取不可变列表。
编辑 2021-05-01 @Rup: 要获得可变列表,您可以使用
var list = new ArrayList<String>(List.of(array));
编辑 2021-05-04: 使用起来可能会更快
var list = new ArrayList<String>(Arrays.asList(array));
答案 10 :(得分:0)
基于java.util.Collections.addAll(Collection<? super String> c, String... elements)
的引用,它的实现类似于您的第一种方法,它说
将所有指定的元素添加到指定的集合中。要添加的元素可以单独指定,也可以指定为数组。这种方便方法的行为与c.addAll(Arrays.asList(elements))的行为相同,但在大多数实现中,此方法可能会运行得更快。
它在jdk中的实现是(jdk7)
public static <T> boolean addAll(Collection<? super T> c, T... elements) {
boolean result = false;
for (T element : elements)
result |= c.add(element);
return result;
}
因此,在您的样本中,更好的方法必须是Collections.addAll(list, array);
从Java 8开始,我们可以使用可能表现更好的Stream
api
例如: -
String[] array = {"item1", "item2", "item3"};
Stream<String> stream = Stream.of(array);
//if the array is extremely large
stream = stream.parallel();
final List<String> list = stream.collect(Collectors.toList());
如果数组非常大,我们可以使用并行流(stream = stream.parallel()
)并行批处理操作,它将利用所有CPU快速完成任务。如果数组长度非常小,并行流将比顺序流花费更多时间。