哪种列表初始化方式更好

Che*_*eng 7 java

我想知道,列表的初始化哪种方式更好?


public class Main {
    private final List<String> l = new ArrayList<String>();

    {
        l.add("a");
        l.add("b");
        l.add("c");
    }
}
Run Code Online (Sandbox Code Playgroud)
public class Main {

    private final List<String> l = new ArrayList<String>() {{
        l.add("a");
        l.add("b");
        l.add("c");        
    }};
}
Run Code Online (Sandbox Code Playgroud)

Ror*_*ick 6

我更喜欢使用下一种静态工厂方法:

public final class CollectionUtils {
    private CollectionUtils() {  
    }

    public static <T> List<T> list(T... data) {
        return Arrays.asList(data);
    }

    public static <T> ArrayList<T> newArrayList() {
        return new ArrayList<T>();
    }

    public static <T> ArrayList<T> newArrayList(T... data) {
        return new ArrayList<T>(list(data));
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,您可以在下一个方式中在代码中使用它们:

import static CollectionUtils.list;
import static CollectionUtils.newArrayList;

public class Main {
    private final List<String> l1 = list("a", "b", "c");
    private final List<String> l2 = newArrayList("a", "b", "c");
}
Run Code Online (Sandbox Code Playgroud)

因此,您可以获得相对紧凑的创建和填充列表的方式,而不需要复制泛型声明.注意,该list方法只是创建数组的列表视图.您以后不能向其添加元素(或删除).同时newArrayList创造通常的ArrayList对象.

正如Joachim Sauer所指出的,这些实用方法(以及许多其他有用的东西)可以在Google Collections库中找到(它现在是Guava项目的一部分).

  • Google Collections会为您(以及许多其他内容)执行此操作.例如,这些工厂方法在"Lists"类中. (2认同)

dfa*_*dfa 4

前者,因为它不创建匿名类;在这里检查原因