如何在Java中创建一个新的列表

905

我们创建一个 Set 集合,如下所示:

Set myset = new HashSet()

在Java中如何创建List

25个回答

1163
List myList = new ArrayList();

或者使用泛型(Java 7或更高版本)

List<MyType> myList = new ArrayList<>();

或使用泛型(旧版Java)

List<MyType> myList = new ArrayList<MyType>();

80
请注意,ArrayList 不是唯一的列表类型 -- 就这个问题而言,HashSet 也不是唯一的集合类型。 - slim
22
我很惊讶没有人提到你可以在Java文档中查找列表接口,以获取实现List接口的所有类的明确列表:http://docs.oracle.com/javase/7/docs/api/java/util/List.html - David Mason
5
如果你使用一个集成开发环境(IDE),通常可以在其中查看类型层次结构,这可能更方便。在 Eclipse 中,默认的快捷键是 F4,在 IDEA 中是 Ctrl+H。 - David Mason
1
据我所知,在C#中无法使用泛型与ArrayList [MSDN]。 - IEnjoyEatingVegetables
5
Java 7和8可以用<>替换第二个显式类型参数<MyType>。 - Jannik
显示剩余2条评论

586

此外,如果您想创建一个包含内容的列表(尽管它将具有固定的大小):

List<String> messages = Arrays.asList("Hello", "World!", "How", "Are", "You");

18
注意事项是,由asList()返回的列表类型是不可变的。 - Avrom
79
@Avron - 错误:它仅具有固定大小:您无法更改大小,但可以更改内容(附带说明?) - user85421
太棒了。谢谢你的精炼。 - R Claven
1
如果列表中只有一件事,我会使用Collections.singletonList()而不是Arrays.asList()。(但是,我猜,我不知道为什么。) - MikeB
@MikeB 如果你不知道为什么,那就坚持使用 arrays.asList。 - bharal
因为IntelliJ这么说了 @bharal - notacorn

211

让我总结并增加一些内容:

JDK

1. new ArrayList<String>();
2. Arrays.asList("A", "B", "C")

Guava

1. Lists.newArrayList("Mike", "John", "Lesly");
2. Lists.asList("A","B", new String [] {"C", "D"});

不可变列表

1. Collections.unmodifiableList(new ArrayList<String>(Arrays.asList("A","B")));
2. ImmutableList.builder()                                      // Guava
            .add("A")
            .add("B").build();
3. ImmutableList.of("A", "B");                                  // Guava
4. ImmutableList.copyOf(Lists.newArrayList("A", "B", "C"));     // Guava

空不可变列表

1. Collections.emptyList();
2. Collections.EMPTY_LIST;

字符列表

1. Lists.charactersOf("String")                                 // Guava
2. Lists.newArrayList(Splitter.fixedLength(1).split("String"))  // Guava

整数列表

Ints.asList(1,2,3);                                             // Guava

1
Ints.asList 不会创建一个不可变列表,而是创建一个由给定整数数组支持的固定大小列表 (即它支持 List.set(int, Object) 方法)。"不可变字符列表" 的第二个例子也不是真正的不可变的(我会删掉那一行)。 - Grzegorz Rożniecki
9
不使用泛型会为任何阅读此文章的开发者提供一个非常“好”的例子。 - Natix

94

在Java 8中

创建一个非空的固定大小列表(不支持添加、删除等操作):

List<Integer> list = Arrays.asList(1, 2); // but, list.set(...) is supported

创建一个非空的可变列表:

List<Integer> list = new ArrayList<>(Arrays.asList(3, 4));

Java 9中的新特性

使用新的List.of(...)静态工厂方法:

List<Integer> immutableList = List.of(1, 2);

List<Integer> mutableList = new ArrayList<>(List.of(3, 4));

在Java 10中

使用局部变量类型推断

var list1 = List.of(1, 2);

var list2 = new ArrayList<>(List.of(3, 4));

var list3 = new ArrayList<String>();

跟随最佳实践...

不要使用原始类型

自Java 5以来,泛型已成为该语言的一部分 - 您应该使用它们:

List<String> list = new ArrayList<>(); // Good, List of String

List list = new ArrayList(); // Bad, don't do that!

面向接口编程

举例来说,针对 List 接口进行编程:

List<Double> list = new ArrayList<>();

改为:

ArrayList<Double> list = new ArrayList<>(); // This is a bad idea!

30

11
我甚至会加上“十次里有八次”的说法,就是因为在99%的情况下,你都会使用ArrayList,而这并不重要。 - Joachim Sauer
1
链表在你只关心两端时语义上是合适的。 - Adam Jaskiewicz
链表在迭代时非常优秀。对我来说,它们似乎更加优雅,但可能只是因为我先学了Lisp再学Java的缘故。 - KarlP
@Karlp 同意。我认为在大多数情况下,ArrayList 和 LinkedList 的使用比例大约是五五开,而答案并不总是关于操作的复杂度;更常见的是根据手头问题选择感觉正确的数据结构。 - Adam Jaskiewicz
1
我几乎总是使用 ArrayList。如果我只处理列表的两端,那么我会使用双端队列(或队列),并使用 ArrayDeque 实现。原因是尽管基于数组的实现可能会浪费一些空槽(当我无法预测所需容量时),但对于小集合来说,这与链表(或双端队列)中所有节点实例的开销相当。而且作为回报,我可以获得随机访问。LinkedList 提供了什么独特的好处? - erickson

23
自从Java 7以来,你可以使用泛型实例创建的类型推断,因此在赋值语句的右侧不需要重复泛型参数。
List<String> list = new ArrayList<>();

固定大小列表的定义如下:

List<String> list = Arrays.asList("foo", "bar");

对于不可变列表,您可以使用Guava库:
List<String> list = ImmutableList.of("foo", "bar");

我有一个关于这个声明 List<String> list = Arrays.asList("foo", "bar"); 的问题。我想知道声明中的 list 是否是一个对象? - user5447339

21

List 是一个像 Set 一样的接口,并且有 ArrayListLinkedList 作为通用实现

我们可以这样创建 List:

 List<String> arrayList = new ArrayList<>();
 List<String> linkedList = new LinkedList<>(); 

我们也可以创建一个固定大小的列表:

List<String> list = Arrays.asList("A", "B", "C");

通常情况下,我们使用ArrayList而不是LinkedList实现:

  1. LinkedList在有大量元素时,需要占用大量的空间,并且性能表现不佳。
  2. LinkedList中的任何索引操作都需要O(n)的时间,而ArrayList只需要O(1)的时间。
  3. 请查看此链接获取更多信息。

Arrays.asList创建的列表无法进行结构修改,但其元素仍然可以修改。

Java 8

根据文档,方法Collections.unmodifiableList返回指定列表的不可修改视图。 我们可以像这样获取它:

Collections.unmodifiableList(Arrays.asList("A", "B", "C"));

Java 9

如果我们使用的是Java 9,则:

List<String> list = List.of("A", "B");

Java 10

如果我们使用的是 Java 10,则方法 Collectors.unmodifiableList 将返回 Java 9 中引入的真正不可修改的列表实例。有关 Collections.unmodifiableListCollectors.unmodifiableListJava 10中差异的更多信息,请参见此答案


21
//simple example creating a list form a string array

String[] myStrings = new String[] {"Elem1","Elem2","Elem3","Elem4","Elem5"};

List mylist = Arrays.asList(myStrings );

//getting an iterator object to browse list items

Iterator itr= mylist.iterator();

System.out.println("Displaying List Elements,");

while(itr.hasNext())

  System.out.println(itr.next());

20

List只是一个接口,就像Set一样。

就像HashSet是Set的一种实现,具有关于添加/查找/删除性能的某些属性,ArrayList是List的最基本实现。

如果您查看相应接口的文档,您会找到“所有已知实现类”,并且可以决定哪一个更适合您的需求。

很可能它就是ArrayList


13

以下是创建列表的一些方法。

  • 这将创建一个固定大小的列表,无法添加/删除元素,如果您尝试这样做,它将抛出一个java.lang.UnsupportedOperationException异常。
    List<String> fixedSizeList = Arrays.asList(new String[] {"Male", "Female"});
    List<String> fixedSizeList = Arrays.asList("Male", "Female");
    List<String> fixedSizeList = List.of("Male", "Female"); //from java9
下面的版本是一个简单的列表,您可以添加/删除任意数量的元素。
 List<String> list = new ArrayList<>();

  • 以下是在Java中创建LinkedList的方法。如果您需要频繁插入/删除元素,请使用LinkedList而不是ArrayList

 List<String> linkedList = new LinkedList<>();

6
你可以使用 Arrays.asList("男性", "女性") - Johny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接