关于java:使用一些预定义值初始化ArrayList

Initializing ArrayList with some predefined values

本问题已经有最佳答案,请猛点这里访问。

我有一个示例程序,如图所示。

我希望我的ArrayListsymbolsPresent用一些预定义的符号初始化:1、2、3和4。

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
new String[] {"One","Two","Three","Four"};

1
List<String> places = Arrays.asList("One","Two","Three");

数组


双括号初始化是一个选项:

1
2
3
4
5
6
List<String> symbolsPresent = new ArrayList<String>() {{
   add("ONE");
   add("TWO");
   add("THREE");
   add("FOUR");
}};

注意,在jls§15.9所示的赋值表达式中,String泛型类型参数是必需的。

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
 private ArrayList<String> symbolsPresent = new ArrayList<String>(Arrays.asList(new String[] {"One","Two","Three","Four"}));


还可以使用varargs语法使代码更清晰:

使用重载构造函数:

1
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a","b","c"));

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
public class Main {
    public static void main(String[] args) {
        List<String> examples = List.of("one","two","three");
        System.out.println(examples);
    }
}

输出:

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):

List places = Collections.unmodifiableList(Arrays.asList("One","Two","Three"));


我使用从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);

}    
}