Initializing ArrayList with some predefined values
我有一个示例程序,如图所示。
我希望我的
1 2 3 4 | symbolsPresent.add("ONE"); symbolsPresent.add("TWO"); symbolsPresent.add("THREE"); symbolsPresent.add("FOUR"); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import java.util.ArrayList; public class Test { private ArrayList<String> symbolsPresent = new ArrayList<String>(); public ArrayList<String> getSymbolsPresent() { return symbolsPresent; } public void setSymbolsPresent(ArrayList<String> symbolsPresent) { this.symbolsPresent = symbolsPresent; } public static void main(String args[]) { Test t = new Test(); System.out.println("Symbols Present is" + t.symbolsPresent); } } |
有可能吗?
试试这个
1 |
或
1 |
数组
双括号初始化是一个选项:
1 2 3 4 5 6 | List<String> symbolsPresent = new ArrayList<String>() {{ add("ONE"); add("TWO"); add("THREE"); add("FOUR"); }}; |
注意,在jls§15.9所示的赋值表达式中,
It is a compile-time error if a class instance creation expression declares an anonymous class using the"<>" form for the class's type arguments.
如何使用重载的arraylist构造函数。
1 |
还可以使用varargs语法使代码更清晰:
使用重载构造函数:
1 |
utils模块中的子类arraylist:
1 2 3 4 5 6 7 | public class MyArrayList<T> extends ArrayList<T> { public MyArrayList(T... values) { super(Arrays.asList(values)); } } ArrayList<String> list = new MyArrayList<String>("a","b","c"); |
或采用静态工厂方法(我的首选方法):
1 2 3 4 5 6 7 | public class Utils { public static <T> ArrayList<T> asArrayList(T... values) { return new ArrayList<T>(Arrays.asList(values)); } } ArrayList<String> list = Utils.asArrayList("a","b","c"); |
1 2 3 4 5 6 7 8 | import com.google.common.collect.Lists; ... ArrayList<String> getSymbolsPresent = Lists.newArrayList("item 1","item 2"); ... |
1 2 3 4 5 6 7 8 9 | public static final List<String> permissions = new ArrayList<String>() {{ add("public_profile"); add("email"); add("user_birthday"); add("user_about_me"); add("user_location"); add("user_likes"); add("user_posts"); }}; |
可以使用Java 8流API。您可以创建对象流并将其作为列表收集。
1 2 | private List<String> symbolsPresent = Stream.of("ONE","TWO","THREE","FOUR") .collect(Collectors.toList()); |
Java 9允许您使用EDCOX1×2工厂来创建一个不可修改的列表。
1 2 3 4 5 6 |
输出:
1 | [one, two, three] |
我喜欢在构造器中进行所有初始化
1 2 3 4 5 6 7 8 | public Test() { symbolsPresent = new ArrayList<String>(); symbolsPresent.add("ONE"); symbolsPresent.add("TWO"); symbolsPresent.add("THREE"); symbolsPresent.add("FOUR"); } |
编辑:当然可以选择,其他人更喜欢在声明中初始化。这两者都是有效的,我选择了构造函数,因为所有类型的初始化都可能存在(如果您需要一个循环或参数,…)。但是,我在源代码顶部初始化声明中的常量。最重要的是遵守你喜欢的规则,在我们的课堂上保持一致。
我建议使用array.aslist()进行单行初始化。对于声明和初始化列表的不同方式,还可以引用Java中的ARARYLIST初始化。
此外,如果要强制列表为只读(如果修改,将引发UnsupportedOperationException):
我使用从arraylist继承的泛型类,并使用带有变量号或参数的参数实现构造函数:
1 2 3 4 5 6 7 | public class MyArrayList<T> extends ArrayList<T> { public MyArrayList(T...items){ for (T item : items) { this.add(item); } } } |
例子:
1 | MyArrayList<String>myArrayList=new MyArrayList<String>("s1","s2","s2"); |
如果只想在任何方法之外进行初始化,请使用初始值设定项块:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | import java.util.ArrayList; public class Test { private ArrayList<String> symbolsPresent = new ArrayList<String>(); // All you need is this block. { symbolsPresent = new ArrayList<String>(); symbolsPresent.add("ONE"); symbolsPresent.add("TWO"); symbolsPresent.add("THREE"); symbolsPresent.add("FOUR"); } public ArrayList<String> getSymbolsPresent() { return symbolsPresent; } public void setSymbolsPresent(ArrayList<String> symbolsPresent) { this.symbolsPresent = symbolsPresent; } public static void main(String args[]) { Test t = new Test(); System.out.println("Symbols Present is" + t.symbolsPresent); } } |