在一行中初始化 ArrayList

新手上路,请多包涵

我想创建一个用于测试目的的选项列表。起初,我这样做了:

 ArrayList<String> places = new ArrayList<String>();
places.add("Buenos Aires");
places.add("Córdoba");
places.add("La Plata");

然后,我重构了代码如下:

 ArrayList<String> places = new ArrayList<String>(
    Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));

有一个更好的方法吗?

原文由 Macarse 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 382
2 个回答

实际上,初始化 ArrayList 的“最佳”方法可能是您编写的方法,因为它不需要以任何方式创建新的 List

 ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");

要注意的是,引用该 list 实例需要大量的输入。

还有一些替代方法,例如使用实例初始化程序创建匿名内部类(也称为“双括号初始化”):

 ArrayList<String> list = new ArrayList<String>() {{
    add("A");
    add("B");
    add("C");
}};

但是,我不太喜欢这种方法,因为你最终得到的是 ArrayList 的一个子类,它有一个实例初始化器,并且创建该类只是为了创建一个对象 - 这看起来就像对我来说有点矫枉过正。

如果 Project CoinCollection Literals 提议 被接受(它计划在 Java 7 中引入,但它也不太可能成为 Java 8 的一部分),那就太好了:

 List<String> list = ["A", "B", "C"];

不幸的是,它不会在这里帮助你,因为它会初始化一个不可变的 List 而不是 ArrayList ,而且,它还不可用,如果它曾经可用的话。

原文由 coobird 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果您只是将它声明为 List 会更简单 - 它必须是 ArrayList 吗?

 List<String> places = Arrays.asList("Buenos Aires", "Córdoba", "La Plata");

或者,如果您只有一个元素:

 List<String> places = Collections.singletonList("Buenos Aires");

这意味着 places不可变 的(尝试更改它会导致抛出 UnsupportedOperationException 异常)。

要创建一个具体的可变列表 ArrayList 您可以从不可变列表中创建一个 ArrayList

 ArrayList<String> places = new ArrayList<>(Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));

并导入正确的包:

 import java.util.Arrays;

原文由 Tom 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题