数组到集合:优化代码

时间:2010-11-23 10:26:13

标签: java arrays collections

有没有更好的方法来实现这一目标?

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;
}

只是看着它,我不相信它比第一种方法更快

11 个答案:

答案 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) 获取不可变列表。

https://docs.oracle.com/en/java/javase/16/core/creating-immutable-lists-sets-and-maps.html#GUID-202D195E-6E18-41F6-90C0-7423B2C9B381

编辑 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快速完成任务。如果数组长度非常小,并行流将比顺序流花费更多时间。