在java中初始化string列表的最简单方法是什么?

我正在寻找最短的方式(在代码中)来初始化string和string数组列表,即包含“s1”,“s2”,“s3”string元素的列表/数组。

有各种select。 我个人喜欢使用番石榴 :

List<String> strings = Lists.newArrayList("s1", "s2", "s3"); 

(无论如何,番石榴的图书馆值得拥有,当然:)

只使用JDK,您可以使用:

 List<String> strings = Arrays.asList("s1", "s2", "s3"); 

请注意,这将返回一个ArrayList ,但这不是正常的java.util.ArrayList – 它是一个可变但固定大小的内部。

就我个人而言,我更喜欢Guava版本,因为它明确了发生了什么事情(将返回的列表实现)。 如果您静态导入该方法,那么还是很清楚发生了什么事情:

 // import static com.google.common.collect.Lists.newArrayList; List<String> strings = newArrayList("s1", "s2", "s3"); 

…而如果你静态导入asList它看起来有点奇怪。

另一个番石榴选项,如果你不想要一个可修改的任何方式列表:

 ImmutableList<String> strings = ImmutableList.of("s1", "s2", "s3"); 

我通常希望有一个完全可变的列表(在这种情况下Lists.newArrayList是最好的) 完全不可变的列表(在这种情况下ImmutableList.of是最好的)。 我真的很想要一个可变的但固定大小的列表。

Java 9+

Java 9引入了一个方便的List.of方法, List.of如下:

 List<String> l = List.of("s1", "s2", "s3"); 

Java 8和更老的

这里有几个select:

 // Short, but the resulting list is fixed size. List<String> list1 = Arrays.asList("s1", "s2", "s3"); // Similar to above, but the resulting list can grow. List<String> list2 = new ArrayList<>(Arrays.asList("s1", "s2", "s3")); // Using initialization block. Useful if you need to "compute" the strings. List<String> list3 = new ArrayList<String>() {{ add("s1"); add("s2"); add("s3"); }}; 

说到数组,你可以在这样的声明处初始化它:

 String[] arr = { "s1", "s2", "s3" }; 

如果您需要重新初始化或创build它,而不将其存储在variables中,则可以

 new String[] { "s1", "s2", "s3" } 

如果string常量可能,但它看起来像

 String[] arr = { "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", "s11", "s12", "s13" }; 

在这些我通常更喜欢写作

 String[] arr = "s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13".split(","); 
 List<String> stringList = Arrays.asList("s1", "s2", "s3"); 

所有这些对象都存在于JDK中。

PS:正如aioobe所说,这使得名单固定大小。

您可以使用标准Java API中的Arrays类: http : //download.oracle.com/javase/6/docs/api/java/util/Arrays.html#asList(T …)

 List<String> strings = Arrays.asList("s1", "s2", "s3"); 

请注意,结果列表是固定大小(您不能添加到它)。

使用Eclipse集合 ,您可以编写以下内容:

 List<String> list = Lists.mutable.with("s1", "s2", "s3"); 

你也可以更具体的types,是否可变或不可变。

 MutableList<String> mList = Lists.mutable.with("s1", "s2", "s3"); ImmutableList<String> iList = Lists.immutable.with("s1", "s2", "s3"); 

你也可以用Sets,Bags和Maps来做同样的事情:

 Set<String> set = Sets.mutable.with("s1", "s2", "s3"); MutableSet<String> mSet = Sets.mutable.with("s1", "s2", "s3"); ImmutableSet<String> iSet = Sets.immutable.with("s1", "s2", "s3"); Bag<String> bag = Bags.mutable.with("s1", "s2", "s3"); MutableBag<String> mBag = Bags.mutable.with("s1", "s2", "s3"); ImmutableBag<String> iBag = Bags.immutable.with("s1", "s2", "s3"); Map<String, String> map = Maps.mutable.with("s1", "s1", "s2", "s2", "s3", "s3"); MutableMap<String, String> mMap = Maps.mutable.with("s1", "s1", "s2", "s2", "s3", "s3"); ImmutableMap<String, String> iMap = Maps.immutable.with("s1", "s1", "s2", "s2", "s3", "s3"); 

SortedSets,SortedBags和SortedMaps也有工厂。

 SortedSet<String> sortedSet = SortedSets.mutable.with("s1", "s2", "s3"); MutableSortedSet<String> mSortedSet = SortedSets.mutable.with("s1", "s2", "s3"); ImmutableSortedSet<String> iSortedSet = SortedSets.immutable.with("s1", "s2", "s3"); SortedBag<String> sortedBag = SortedBags.mutable.with("s1", "s2", "s3"); MutableSortedBag<String> mSortedBag = SortedBags.mutable.with("s1", "s2", "s3"); ImmutableSortedBag<String> iSortedBag = SortedBags.immutable.with("s1", "s2", "s3"); SortedMap<String, String> sortedMap = SortedMaps.mutable.with("s1", "s1", "s2", "s2", "s3","s3"); MutableSortedMap<String, String> mSortedMap = SortedMaps.mutable.with("s1", "s1", "s2", "s2", "s3","s3"); ImmutableSortedMap<String, String> iSortedMap = SortedMaps.immutable.with("s1", "s1", "s2", "s2", "s3","s3"); 

注意:我是Eclipse集合的提交者。

我不熟悉番石榴,但几乎所有在其他答案和使用JDK中提到的解决scheme都有一些缺陷:

  1. Arrays.asList方法返回一个固定大小的列表。

  2. 已知{{Double-brace initialization}}会产生类path混乱并减慢执行速度 。 它还需要每个元素的一行代码。

  3. Java 9 :静态工厂方法List.of返回一个结构不变的列表。 而且, List.of是基于价值的 ,因此它的合同不保证每次都会返回一个新的对象。


这里是一个Java 8单线程收集多个单独的对象到一个ArrayList ,或任何收集的事情。

 List<String> list = Stream.of("s1", "s2", "s3").collect(Collectors.toCollection(ArrayList::new)); 

注意 :aioobe的解决scheme是复制临时集合( new ArrayList<>(Arrays.asList("s1", "s2", "s3")) )。