Cách tạo một Danh sách mới trong Java


762

Chúng tôi tạo ra Setnhư:

Set myset = new HashSet()

Làm thế nào để chúng ta tạo một ListJava?


1
Trên javadoc cho Danh sách. "Tất cả các lớp triển khai đã biết: AbstractList, AbstractSequentialList, ArrayList, AttributionList, CopyOnWriteArrayList, LinkedList, RoleList, RoleUnresolveList, Stack, Vector"
KitsuneYMG

121
Câu hỏi này là một trong những lượt truy cập hàng đầu của google cho "danh sách tạo java" và nó có một bộ câu trả lời rất hữu ích, vì vậy có vẻ như là một câu hỏi đủ hợp lý với tôi :-)
JosephH

52
Đó là một câu hỏi hay với câu trả lời hay. Một trong những mục tiêu của Stack Overflow là tạo ra một số loại câu trả lời chính tắc cho các câu hỏi lập trình, ít nhất là theo những người sáng lập trang web. Vì vậy, hãy cố gắng tránh bỏ phiếu xuống các loại bài đăng này trong tương lai, nếu bạn có thể chống lại sự cám dỗ.
eggonlegs

Câu trả lời:


977
List myList = new ArrayList();

hoặc với generic ( Java 7 trở lên)

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

hoặc với generic (phiên bản java cũ)

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

68
Lưu ý rằng ArrayList không phải là loại Danh sách duy nhất - và, liên quan đến câu hỏi, Hashset không phải là loại Set duy nhất.
mỏng

17
Tôi ngạc nhiên khi không ai đề cập rằng bạn có thể tra cứu giao diện danh sách trong tài liệu Java để có được danh sách xác định tất cả các lớp thực hiện Danh sách: docs.oracle.com/javase/7/docs/api/java/util /List.html
David Mason

5
Nếu bạn sử dụng IDE, bạn cũng thường có thể xem hệ thống phân cấp kiểu trong đó, có thể thuận tiện hơn. Trong Eclipse, lối tắt mặc định là F4 và trong IDEA, đó là Ctrl + H.
David Mason

1
Từ những gì tôi hiểu rằng bạn không thể sử dụng Generics với ArrayList trong C # MSDN
JohnOsborne

5
Đối số loại rõ ràng thứ hai <MyType> có thể được thay thế bằng chỉ <> cho Java 7 và 8.
Jannik

469

Ngoài ra, nếu bạn muốn tạo một danh sách có những thứ trong đó (mặc dù nó sẽ có kích thước cố định):

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

15
Thông báo trước là loại danh sách này (danh sách được trả về bởi asList ()) là bất biến.
năm09

70
@Avron - sai: nó chỉ có kích thước cố định: bạn không thể thay đổi kích thước, nhưng bạn có thể thay đổi nội dung (báo trước?)
user85421

Tuyệt vời. Cảm ơn bạn đã súc tích.
R Claven

1
nếu chỉ có một thứ trong danh sách, tôi sử dụng Collections.singletonList () thay vì Arrays.asList (). (Nhưng, tôi đoán, tôi không biết tại sao.)
MikeB

@MikeB nếu bạn không biết tại sao thì hãy bám vào mảng.aslist
bharal

183

Hãy để tôi tóm tắt và thêm một cái gì đó:

JDK

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

Trái ổi

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

Danh sách bất biến

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

Danh sách bất biến

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

Danh sách nhân vật

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

Danh sách các số nguyên

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

Ints.asListkhông tạo ra một danh sách bất biến, nhưng một danh sách có kích thước cố định được hỗ trợ bởi mảng ints đã cho (nghĩa là nó hỗ trợ List.set(int, Object)). Ví dụ thứ hai về "Danh sách nhân vật bất biến" cũng không phải là bất biến (Tôi sẽ xóa dòng đó).
Xaerxess

9
Không sử dụng thuốc generic tạo ra một ví dụ thực sự "tốt" cho bất kỳ nhà phát triển nào sẽ đọc điều này.
Natix

60

Trong Java 8

Để tạo danh sách kích thước cố định không trống (các thao tác như thêm, xóa, v.v., không được hỗ trợ):

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

Để tạo một danh sách đột biến không trống:

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

Trong Java 9

Sử dụng một List.of(...)phương thức tĩnh nhà máy mới:

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

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

Trong Java 10

Sử dụng suy luận kiểu biến cục bộ :

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

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

var list3 = new ArrayList<String>();

Và làm theo các thực hành tốt nhất ...

Không sử dụng loại thô

Kể từ Java 5, generic đã là một phần của ngôn ngữ - bạn nên sử dụng chúng:

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

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

Chương trình giao diện

Ví dụ: chương trình tới Listgiao diện:

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

Thay vì:

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

1
Xin chào, bạn có thể vui lòng đề xuất nơi tôi có thể tìm hiểu những khác biệt này và sự phát triển của Java không? Có vẻ rất thú vị!
shiv

31

Đầu tiên đọc cái này , rồi đọc cái nàycái này . 9 trong số 10 lần bạn sẽ sử dụng một trong hai triển khai đó.

Trên thực tế, chỉ cần đọc Hướng dẫn của Sun về khung Bộ sưu tập .


11
Tôi thậm chí sẽ thêm "8 lần trong số 10", bạn sẽ sử dụng ArrayList, vì đơn giản là nó không quan trọng trong 9,9 lần trong số 10.
Joachim Sauer

1
LinkedList phù hợp về mặt ngữ nghĩa khi bạn chỉ thực sự quan tâm đến kết thúc.
Adam Jaskiewicz

LinkedLists là tuyệt vời nếu bạn chỉ lặp đi lặp lại trên chúng. Đối với tôi, có vẻ như các danh sách được liên kết thanh lịch hơn, nhưng có lẽ đó chỉ là do tôi học lisp trước Java.
KarlP

@Karlp Đồng ý. Tôi sẽ nói rằng đó là khoảng 50/50 phần lớn thời gian giữa ArrayList và LinkedList, và câu trả lời không phải lúc nào cũng là về sự phức tạp của các hoạt động; thường xuyên hơn, nó đơn giản là những gì cảm thấy đúng cho vấn đề trong tầm tay.
Adam Jaskiewicz

1
Tôi hầu như luôn luôn sử dụng ArrayList. Nếu tôi chỉ làm việc với phần cuối của danh sách, thì đó là một deque (hoặc hàng đợi) và tôi sử dụng ArrayDequetriển khai. Lý do là vì mặc dù việc triển khai dựa trên mảng có thể lãng phí một số bộ nhớ trên các vị trí trống (khi tôi không thể dự đoán dung lượng cần thiết), đối với các bộ sưu tập nhỏ, điều này có thể so sánh với chi phí chung của tất cả các phiên bản nút trong danh sách được liên kết ( hoặc deque). Và đổi lại, tôi có được quyền truy cập ngẫu nhiên. Những lợi ích độc đáo nào LinkedListcung cấp?
erickson

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

21

Vì Java 7, bạn có kiểu suy luận để tạo cá thể chung , do đó không cần phải sao chép các tham số chung ở phía bên phải của phép gán:

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

Một danh sách kích thước cố định có thể được định nghĩa là:

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

Đối với danh sách bất biến, bạn có thể sử dụng thư viện Guava :

List<String> list = ImmutableList.of("foo", "bar");

Tôi có một câu hỏi liên quan đến khai báo này Danh sách <String> list = Arrays.asList ("foo", "bar"); Tôi tự hỏi liệu danh sách trong khai báo là một đối tượng?

20

Danh sách chỉ là một giao diện giống như Set .

Giống như Hashset là một triển khai của Tập hợp có các thuộc tính nhất định liên quan đến hiệu suất thêm / tra cứu / loại bỏ, ArrayList là triển khai thực hiện Danh sách.

Nếu bạn xem tài liệu về các giao diện tương ứng, bạn sẽ tìm thấy "Tất cả các lớp triển khai đã biết" và bạn có thể quyết định cái nào phù hợp hơn với nhu cầu của mình.

Rất có thể đó là ArrayList .


18

Listlà một giao diện như Setvà có ArrayListLinkedListnhư là thực hiện mục đích chung .

Chúng tôi có thể tạo Danh sách như:

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

Chúng tôi cũng có thể tạo một danh sách kích thước cố định như:

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

Chúng tôi hầu như luôn luôn sử dụng ArrayListtrái ngược với LinkedListthực hiện:

  1. LinkedList sử dụng nhiều không gian cho các đối tượng và hoạt động kém khi chúng ta có nhiều yếu tố.
  2. Bất kỳ hoạt động được lập chỉ mục nào trong LinkedListthời gian yêu cầu O (n) so với O (1) trong ArrayList.
  3. Kiểm tra liên kết này để biết thêm thông tin.

Danh sách được tạo bởi Arrays.asListở trên không thể được sửa đổi về mặt cấu trúc nhưng các yếu tố của nó vẫn có thể được sửa đổi.

Java 8

Theo tài liệu , phương thức Collections.unmodifiableListtrả về một khung nhìn không thể thay đổi của danh sách đã chỉ định. Chúng ta có thể có được nó như sau:

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

Java 9

Trong trường hợp chúng tôi đang sử dụng Java 9 thì:

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

Java 10

Trong trường hợp chúng ta đang ở Java 10 thì phương thức Collectors.unmodifiableListsẽ trả về một thể hiện của danh sách thực sự không thể thay đổi được giới thiệu trong Java 9. Kiểm tra câu trả lời này để biết thêm thông tin về sự khác biệt Collections.unmodifiableList so với Collectors.unmodifiableListtrong Java 10 .


9

Đôi khi - nhưng chỉ rất hiếm khi - thay vì một ArrayList mới, bạn có thể muốn một LinkedList mới. Bắt đầu với ArrayList và nếu bạn gặp vấn đề về hiệu năng và bằng chứng cho thấy danh sách đó là vấn đề, và rất nhiều việc thêm và xóa vào danh sách đó - sau đó - không phải trước đó - hãy chuyển sang LinkedList và xem mọi thứ có cải thiện không. Nhưng trong chính, hãy gắn bó với ArrayList và tất cả sẽ ổn.


9
List list = new ArrayList();

Hoặc với thuốc generic

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

Tất nhiên, bạn có thể thay thế chuỗi bằng bất kỳ loại biến nào, chẳng hạn như Integer ,.


7

Một ví dụ:

List somelist = new ArrayList();

Bạn có thể xem javadoc cho Danh sách và tìm tất cả các lớp triển khai đã biết của Listgiao diện được bao gồm trong api java.


7

Sử dụng Bộ sưu tập của Google , bạn có thể sử dụng các phương thức sau trong lớp Danh sách

import com.google.common.collect.Lists;

// ...

List<String> strings = Lists.newArrayList();

List<Integer> integers = Lists.newLinkedList();

Có quá tải cho khởi tạo varargs và khởi tạo từ một Iterable<T>.

Ưu điểm của các phương thức này là bạn không cần chỉ định rõ ràng tham số chung như bạn làm với hàm tạo - trình biên dịch sẽ suy ra nó từ loại biến.


6
List<Object> nameOfList = new ArrayList<Object>();

Bạn cần nhập ListArrayList.


6

Nhiều tùy chọn hơn để làm điều tương tự với Java 8, không tốt hơn, không tệ hơn, chỉ khác và nếu bạn muốn thực hiện thêm một số công việc với danh sách, Luồng sẽ cung cấp cho bạn nhiều lựa chọn thay thế (bộ lọc, bản đồ, giảm, v.v.)

List<String> listA = Stream.of("a", "B", "C").collect(Collectors.toList());
List<Integer> listB = IntStream.range(10, 20).boxed().collect(Collectors.toList());
List<Double> listC = DoubleStream.generate(() -> { return new Random().nextDouble(); }).limit(10).boxed().collect(Collectors.toList());
LinkedList<Integer> listD = Stream.iterate(0, x -> x++).limit(10).collect(Collectors.toCollection(LinkedList::new));

6

Với Java 9, bạn có thể thực hiện các thao tác sau để tạo một bất biến List :

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

List<Integer> mutableList = new ArrayList<>(immutableList);

6

Như một tùy chọn, bạn có thể sử dụng khởi tạo cú đúp ở đây:

List<String> list = new ArrayList<String>(){
  {
   add("a");
   add("b");
  }
};

2
Đây là một hoạt động đắt tiền. Bạn đang tạo một lớp con ẩn danh của ArrayList tại đây.
Vikram Bod Richla

@VikramBod Richla Tôi đồng ý. Đây là nhiều hơn về cú pháp đường ở đây.
tức giận_gopher


5
List arrList = new ArrayList();

Tốt hơn bạn nên sử dụng thuốc generic như đề xuất dưới đây:

List<String> arrList = new ArrayList<String>();

arrList.add("one");

Trong trường hợp bạn sử dụng LinkedList.

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

4

Sử dụng Bộ sưu tập Eclipse, bạn có thể tạo một Danh sách như thế này:

List<String> list1 = Lists.mutable.empty();
List<String> list2 = Lists.mutable.of("One", "Two", "Three");

Nếu bạn muốn một danh sách bất biến:

ImmutableList<String> list3 = Lists.immutable.empty();
ImmutableList<String> list4 = Lists.immutable.of("One", "Two", "Three");

Bạn có thể tránh tự động đấm bốc bằng cách sử dụng danh sách nguyên thủy. Đây là cách bạn tạo danh sách int:

MutableIntList list5 = IntLists.mutable.empty();
MutableIntList list6 = IntLists.mutable.of(1, 2, 3);

ImmutableIntList list7 = IntLists.immutable.empty();
ImmutableIntList list8 = IntLists.immutable.of(1, 2, 3);

Có các biến thể cho tất cả 8 nguyên thủy.

MutableLongList longList       = LongLists.mutable.of(1L, 2L, 3L);
MutableCharList charList       = CharLists.mutable.of('a', 'b', 'c');
MutableShortList shortList     = ShortLists.mutable.of((short) 1, (short) 2, (short) 3);
MutableByteList byteList       = ByteLists.mutable.of((byte) 1, (byte) 2, (byte) 3);
MutableBooleanList booleanList = BooleanLists.mutable.of(true, false);
MutableFloatList floatList     = FloatLists.mutable.of(1.0f, 2.0f, 3.0f);
MutableDoubleList doubleList   = DoubleLists.mutable.of(1.0, 2.0, 3.0);

Lưu ý: Tôi là người đi làm cho Bộ sưu tập Eclipse.


4

Sau đây là một số cách bạn có thể tạo danh sách.

  • Điều này sẽ tạo ra một danh sách với kích thước cố định, việc thêm / xóa các yếu tố là không thể, nó sẽ ném java.lang.UnsupportedOperationExceptionnếu bạn cố gắng làm như vậy.

    List<String> fixedSizeList = Arrays.asList(new String[] {"Male", "Female"});


  • Phiên bản sau đây là một danh sách đơn giản nơi bạn có thể thêm / xóa bất kỳ số lượng phần tử nào.

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


  • Đây là cách tạo một LinkedListjava, Nếu bạn cần thường xuyên chèn / xóa các phần tử trong danh sách, bạn nên sử dụng LinkedListthay vìArrayList

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

1
Bạn có thể sử dụng Arrays.asList("Male", "Female").
Johny

3

Thử cái này:

List<String> messages = Arrays.asList("bla1", "bla2", "bla3");

Hoặc là:

List<String> list1 = Lists.mutable.empty(); // Empty
List<String> list2 = Lists.mutable.of("One", "Two", "Three");

2

Nếu bạn cần một danh sách tuần tự, bất biến với một thực thể duy nhất bạn có thể sử dụng:

List<String> singList = Collections.singletonList("stackoverlow");

2

Như khai báo danh sách mảng trong java giống như

public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable  

Có rất nhiều cách bạn có thể tạo và khởi tạo danh sách mảng trong java.

 1) List list = new ArrayList();

 2) List<type> myList = new ArrayList<>();

 3) List<type> myList = new ArrayList<type>();

 4) Using Utility class

    List<Integer> list = Arrays.asList(8, 4);
    Collections.unmodifiableList(Arrays.asList("a", "b", "c"));

 5) Using static factory method

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


 6) Creation and initializing at a time

    List<String> fixedSizeList = Arrays.asList(new String[] {"Male", "Female"});



 Again you can create different types of list. All has their own characteristics

 List a = new ArrayList();
 List b = new LinkedList();
 List c = new Vector(); 
 List d = new Stack(); 
 List e = new CopyOnWriteArrayList();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.