关于java:如何初始化集合并在同一行上添加数据?

How can I initialize a collection and add data on the same line?

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

在C中,我可以创建某种类型的集合,并用同一行上的数据初始化它。

var foo = new List {"one","two","three"};

在Java中有类似的方法吗?


如果需要只读的List

1
2
3
4
List<String> numbers = Arrays.asList("one","two","three");

// Can't add since the list is immutable
numbers.add("four"); // java.lang.UnsupportedOperationException

如果您想稍后修改List

1
2
3
4
5
List<String> numbers2 = new ArrayList<String>(
                            Arrays.asList("one","two","three"));
numbers2.add("four");

System.out.println(numbers2); // [one, two, three, four]


您可以使用Arrays.asList(T... a)

1
List<String> foo = Arrays.asList("one","two","three");

正如Boris在评论中提到的,结果List是不可变的(即只读)。您需要将其转换为ArrayList或类似文件,以便修改集合:

1
List<String> foo = new ArrayList<String>(Arrays.asList("one","two","three"));

还可以使用匿名子类和初始值设定项创建List

1
2
3
4
5
6
7
List<String> foo = new ArrayList<String>() {
    {
        add("one");
        add("two");
        add("three");
    }
};


我更喜欢使用guava(以前叫google collections)库来完成这项工作,它既消除了再次写下类型的需要,又有各种直接添加数据的方法。

示例:List yourList = Lists.newArrayList();

或添加数据:List yourList = Lists.newArrayList(yourClass1, yourclass2);

这同样适用于所有其他类型的集合及其各种实现。另一个例子:Set treeSet = Sets.newTreeSet();

你可以在https://code.google.com/p/guava-libraries上找到它。/


我能想到的最好的办法是:

1
2
3
4
5
final List<String> foo = new ArrayList<String>() {{
  add("one");
  add("two");
  add("three");
}};

基本上,这表示您正在创建ArrayList类的匿名子类,然后使用"one","two","three"静态初始化该子类。


1
List<String> numbers = Arrays.asList("one","two","three");

正如鲍里斯所说,它使你的numbers不变。

是的,你可以,但是有两行。

1
2
List<String> numbers= new ArrayList<String>();
Collections.addAll(numbers,"one","two","three");

如果你仍然只想在同一条线上,和Gauva一起

1
List<String> numbers= Lists.newArrayList("one","two","three");

1
List<String> list = Arrays.asList("one","two","three")