我想创建一个用于测试目的的选项列表。起初,我这样做了:
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"));
有没有更好的方法可以做到这一点?
网友回答:
实际上,初始化 的“最佳”方法可能是您编写的方法,因为它不需要以任何方式创建新的方法: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 Coin 的 Collection Literals 提案被接受,那就太好了(它计划在 Java 7 中引入,但它也不太可能成为 Java 8 的一部分)。
List<String> list = ["A", "B", "C"];
不幸的是,它在这里不会帮助你,因为它将初始化一个不可变的而不是一个,此外,它还不可用,如果有的话。List
ArrayList
网友回答:
如果你只是把它声明为一个会更简单——它必须是 ArrayList 吗?List
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;
网友回答:
List<String> strings = List.of("foo", "bar", "baz");
这将给你一个 不可变的 ,所以它不能被改变。
在大多数情况下,这是您想要的,您正在预填充它。List
List<String> strings = Arrays.asList("foo", "bar", "baz");
This will give you a * backed by an array, so it cannot change length.
But you can call , so it’s still mutable.List
List.set(...)
*
实现细节:它是java.util.Arrays
中的一个私有嵌套类,名为ArrayList,它与java.util.ArrayList
不同,
即使它们的简单名称相同。
你可以通过静态导入使Java 8更短:Arrays.asList
import static java.util.Arrays.asList;
...
List<String> strings = asList("foo", "bar", "baz");
任何现代 IDE* 都会为您建议并执行此操作。
我不建议将该方法静态导入为 ,因为它令人困惑。List.of
of
*
例如,在IntelliJ IDEA中,您按Alt + Enter
并选择静态导入方法...
Stream
为什么它必须是 ?
在 Java 8 或更高版本中,您可以使用更灵活的:List
Stream
Stream<String> strings = Stream.of("foo", "bar", "baz");
您可以连接 s:Stream
Stream<String> strings = Stream.concat(Stream.of("foo", "bar"),
Stream.of("baz", "qux"));
或者你可以从 a 转到 :Stream
List
import static java.util.stream.Collectors.toList;
...
var strings = Stream.of("foo", "bar", "baz").toList(); // Java 16
List<String> strings = Stream.of("foo", "bar", "baz").collect(toList()); // Java 8
但最好是,只需使用 而不将其收集到 .Stream
List
java.util.ArrayList
*如果要预填充 a 并在之后添加它,请使用ArrayList
List<String> strings = new ArrayList<>(List.of("foo", "bar"));
strings.add("baz");
或在 Java 8 或更早版本中:
List<String> strings = new ArrayList<>(asList("foo", "bar"));
strings.add("baz");
或使用 :Stream
import static java.util.stream.Collectors.toCollection;
List<String> strings = Stream.of("foo", "bar")
.collect(toCollection(ArrayList::new));
strings.add("baz");
但同样,最好直接使用 而不是将其收集到 .Stream
List
*您可能不需要专门用于 ArrayList
。引用JEP 269:
有一小组用例可用于使用预定义的值集初始化可变集合实例。通常最好将这些预定义值放在不可变集合中,然后通过复制构造函数初始化可变集合。
(强调我的)
您说您已在代码中将列表声明为 ,但仅当您使用不在 中的某个成员时才应这样做。ArrayList
ArrayList
List
你很可能没有这样做。
通常,您应该通过要使用的最通用接口(例如,,或)声明变量,并使用特定的实现(例如,或)初始化它们。Iterable
Collection
List
ArrayList
LinkedList
Arrays.asList()
否则,您将代码限制为该特定类型,并且在需要时将更难更改。
例如,如果要将 :ArrayList
void method(...)
// Iterable if you just need iteration, for (String s : strings):
void method(Iterable<String> strings) {
for (String s : strings) { ... }
}
// Collection if you also need .size(), .isEmpty(), or .stream():
void method(Collection<String> strings) {
if (!strings.isEmpty()) { strings.stream()... }
}
// List if you also need random access, .get(index):
void method(List<String> strings) {
strings.get(...)
}
// Don't declare a specific list implementation
// unless you're sure you need it:
void method(ArrayList<String> strings) {
??? // You don't want to limit yourself to just ArrayList
}
另一个例子是总是声明变量 a 即使它通常是 a 或 a ,因为很快有一天你或其他人会想要使用其他类型的 .InputStream
FileInputStream
BufferedInputStream
InputStream
模板简介:该模板名称为【在一行中初始化数组列表】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【Java】栏目查找您需要的精美模板。