我想创建一个用于测试的选项列表。起初,我这样做:
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"));
有更好的方法吗?
在Java中,您无法做到
ArrayList<String> places = new ArrayList<String>( Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));
如前所述,您需要执行双括号初始化:
List<String> places = new ArrayList<String>() {{ add("x"); add("y"); }};
但这可能会迫使您添加注释@SuppressWarnings(“串行”)或生成一个令人讨厌的串行UUID。大多数代码格式化程序也会将其展开为多个语句/行。
或者你也可以这样做
List<String> places = Arrays.asList(new String[] {"x", "y" });
但您可能需要执行@SuppressWarnings(“未选中”)。
此外,根据javadoc,您应该能够做到这一点:
List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");
但我无法用JDK1.6编译它。
有多种方法可以在一行中创建和初始化列表。
//Using Double brace initialization
List<String> list1 = new ArrayList<>() {{ add("A"); add("B"); }};
//Immutable List
List<String> list2 = List.of("A", "B");
//Fixed size list. Can't add or remove element, though replacing the element is allowed.
List<String> list3 = Arrays.asList("A", "B");
//Modifiable list
List<String> list4 = new ArrayList<>(Arrays.asList("A", "B"));
//Using Java Stream
List<String> list5 = Stream.of("A", "B").collect(Collectors.toList());
//Thread safe List
List<String> list6 = new CopyOnWriteArrayList<>(Arrays.asList("A", "B"));
在Java 9中,我们可以很容易地在一行中初始化ArrayList:
List<String> places = List.of("Buenos Aires", "Córdoba", "La Plata");
or
List<String> places = new ArrayList<>(List.of("Buenos Aires", "Córdoba", "La Plata"));
Java 9的这种新方法与以前的方法相比有许多优点:
空间效率不可变性线程安全
有关更多详细信息,请参阅本文->List.of和Arrays.asList之间的区别是什么?