在java中初始化字符串列表的最短方法是什么?

时间:2011-06-29 12:08:11

标签: java arrays string list initialization

我正在寻找最短路径(在代码中)来初始化字符串列表和字符串数组,即包含列表/数组 “s1”,“s2”,“s3”字符串元素。

7 个答案:

答案 0 :(得分:94)

有各种选择。我个人喜欢使用Guava

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,它看起来有点奇怪。

另一个Guava选项,如果您不想要任何可修改的列表:

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

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

答案 1 :(得分:24)

Java 9 +

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

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

Java 8及更早版本

以下是一些替代方案:

// 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" };

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

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

如果字符串常量可能是,它看起来像

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(",");

答案 2 :(得分:14)

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

JDK中存在所有这些对象。

PS:正如aioobe所述,这会使列表固定大小。

答案 3 :(得分:3)

您可以在标准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");

请注意,结果列表是固定大小的(您无法添加)。

答案 4 :(得分:2)

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

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

您还可以更具体地了解类型以及它们是可变的还是不可变的。

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

你也可以对套装,手袋和地图做同样的事情:

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 Collections的提交者。

答案 5 :(得分:1)

JDK2

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

JDK7

//diamond operator
List<String> list = new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");

JDK8

List<String> list = Stream.of("one", "two", "three").collect(Collectors.toList());

JDK9

List<String> list = List.of("one", "two", "three");

此外,Guava等其他图书馆提供了许多其他方式。

答案 6 :(得分:0)

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

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

  2. 已知
  3. {{Double-brace initialization}}会创建类路径混乱和slow down execution。它还需要每个元素一行代码。

  4. Java 9 :静态工厂方法List.of返回结构不可变的列表。此外,List.ofvalue-based,因此其合约并不保证每次都会返回新对象。

  5. 这是一个Java 8单行程序,用于将多个单个对象收集到ArrayList或任何集合中。

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

    注意:aioobe的复制临时集合(new ArrayList<>(Arrays.asList("s1", "s2", "s3")))的解决方案也非常出色。