Làm cách nào để khởi tạo đối tượng Danh sách <String> trong Java?


405

Tôi không thể khởi tạo Danh sách như trong đoạn mã sau:

List<String> supplierNames = new List<String>();
supplierNames.add("sup1");
supplierNames.add("sup2");
supplierNames.add("sup3");
System.out.println(supplierNames.get(1));

Tôi gặp phải lỗi sau:

Không thể khởi tạo kiểu List<String>

Làm thế nào tôi có thể khởi tạo List<String>?

Câu trả lời:


733

Nếu bạn đánh dấu vào API cho Listbạn sẽ nhận thấy nó nói:

Interface List<E>

Là một interfacephương tiện không thể được khởi tạo (không new List()có thể).

Nếu bạn kiểm tra liên kết đó, bạn sẽ tìm thấy một số classes thực hiện List:

Tất cả các lớp triển khai đã biết:

AbstractList, AbstractSequentialList, ArrayList, AttributeList, CopyOnWriteArrayList, LinkedList, RoleList, RoleUnresolvedList, Stack,Vector

Những cái đó có thể được khởi tạo. Sử dụng các liên kết của họ để biết thêm về họ, IE: để biết cái nào phù hợp hơn với nhu cầu của bạn.

3 cái được sử dụng phổ biến nhất có lẽ là:

 List<String> supplierNames1 = new ArrayList<String>();
 List<String> supplierNames2 = new LinkedList<String>();
 List<String> supplierNames3 = new Vector<String>();

Phần thưởng:
Bạn cũng có thể khởi tạo nó bằng các giá trị, theo cách dễ dàng hơn, bằng cách sử dụng Arrays class, như sau:

List<String> supplierNames = Arrays.asList("sup1", "sup2", "sup3");
System.out.println(supplierNames.get(1));

Nhưng lưu ý rằng bạn không được phép thêm nhiều yếu tố vào danh sách đó fixed-size.


1
Arrays.asList là tuyệt vời nhưng như bạn đã nhận thấy bây giờ không thực hiện được những gì người ta mong đợi trong các trường hợp nhưint[] a = {1,2,3}; System.out.println(Arrays.asList(a)); // [[I@70cdd2]
Mr_and_Mrs_D

1
@ JAIL Đó không phải là những gì đang xảy ra. Đó là danh sách một phần tử, trong đó một phần tử là một mảng các số nguyên. Hành vi truy nã có lẽ là một danh sách gồm ba yếu tố 1, 2 và 3.
Christoffer Hammarström

1
@Christoffer Hammarström để in danh sách hoặc mảng, bạn có thể sử dụng java.util.Arrays.toString (mảng);, vì vậy tính năng này đã được cung cấp ..
Maxr1998

1
Một số cách sử dụng Vector như thế nàyở đây . Vì vấn đề luồng
Nuno Rafael Figueiredo

3
Nếu bạn cần danh sách kết quả là một ArrayList, hãy sử dụngnew ArrayList<>(Arrays.asList("sup1", "sup2", "sup3"))
Daniel F

114

Không thể khởi tạo giao diện nhưng có một vài triển khai:

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

// creates immutable lists, so you can't modify such list 
List<String> immutableList = List.of("one", "two", "three");

// if we want mutable list we can copy content of immutable list 
// to mutable one for instance via copy-constructor (which creates shallow copy)
List<String> mutableList = new ArrayList<>(List.of("one", "two", "three"));

Thêm vào đó, có rất nhiều cách khác được cung cấp bởi các thư viện khác như Guava .

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

38

Danh sách là một Giao diện , bạn không thể khởi tạo Giao diện, vì giao diện là quy ước, phương thức nào nên có các lớp của bạn. Để khởi tạo, bạn cần một số thực hiện (triển khai) giao diện đó. Hãy thử đoạn mã dưới đây với các triển khai Danh sách rất phổ biến:

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

hoặc là

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

14

Bạn sẽ cần phải sử dụng ArrayList<String>hoặc như vậy.

List<String> là một giao diện.

Dùng cái này:

import java.util.ArrayList;

...

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

13

Danh sách là một giao diện và bạn không thể khởi tạo giao diện. Thay thế một lớp thực hiện thay thế.

Giống:

List<String> abc = new ArrayList<String>();
List<String> xyz = new LinkedList<String>();

9

Danh sách chỉ là một giao diện, một định nghĩa của một số danh sách chung. Bạn cần cung cấp một triển khai của giao diện danh sách này. Hai phổ biến nhất là:

ArrayList - một danh sách được triển khai trên một mảng

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

LinkedList - một danh sách được triển khai giống như một chuỗi các yếu tố được kết nối với nhau

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

9

Trong hầu hết các trường hợp bạn muốn đơn giản ArrayList- việc thực hiệnList

Trước JDK phiên bản 7

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

JDK 7 trở lên, bạn có thể sử dụng toán tử kim cương

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

Thông tin thêm được viết ở đây Tài liệu Oracle - Bộ sưu tập


7

Tùy thuộc vào loại Danh sách bạn muốn sử dụng, đại loại như

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

sẽ giúp bạn đi

Danh sách là giao diện, ArrayList là một triển khai của giao diện Danh sách. Có thể tìm thấy nhiều triển khai phù hợp hơn với nhu cầu của bạn bằng cách đọc JavaDocs của giao diện Danh sách .


7

Nếu bạn chỉ muốn tạo một bất biến List<T> chỉ có một đối tượng trong đó, bạn có thể sử dụng API này:

List<String> oneObjectList = Collections.singletonList("theOnlyObject”);

Thêm thông tin: tài liệu


5

Danh sách là một Giao diện. Bạn không thể sử dụng Danh sách để khởi tạo nó.

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

Đây là một số trong các lớp liệt kê

ArrayList, LinkedList, Vector

Bạn có thể sử dụng bất kỳ thứ này theo yêu cầu của bạn. Những lớp này có tính năng riêng của nó.


Một số cách sử dụng Vector như thế nàyở đây . Vì vấn đề luồng
Nuno Rafael Figueiredo

3

Chỉ trong trường hợp, bất kỳ ai vẫn còn lảng vảng xung quanh câu hỏi này. Bởi vì, tôi thấy một hoặc hai người dùng mới lại hỏi cùng một câu hỏi và mọi người đều nói sau đó, Không bạn không thể làm điều đó, Thận trọng , Ngoài tất cả các câu trả lời được đưa ra ở đây, tôi muốn cung cấp thêm Thông tin - Có bạn thực sự có thể làm, Danh sách danh sách = Danh sách mới (); Nhưng với chi phí viết các triển khai của tất cả các phương pháp của Giao diện. Khái niệm không chỉ đơn giản là List list = new List (); nhưng

List<Integer> list = new List<Integer>(){

        @Override
        public int size() {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public boolean isEmpty() {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean contains(Object o) {
            // TODO Auto-generated method stub
            return false;
        }

..... và cứ thế (Không thể viết tất cả các phương thức.)

Đây là một ví dụ về lớp Ẩn danh . Nó đúng khi có ai đó tuyên bố, Không bạn không thể khởi tạo giao diện và điều đó đúng. Nhưng bạn không bao giờ có thể nói, Bạn CANT viết Danh sách danh sách = Danh sách mới (); nhưng, rõ ràng bạn có thể làm điều đó và đó là một tuyên bố khó khăn để làm cho điều đó bạn không thể làm .


Để rõ ràng, điều này không tạo ra một đối tượng có loại thực tế là List. Thay vào đó, nó tuyên bố một lớp mới không có tên và thực hiện List, và tại thời điểm chạy sẽ tạo ra một đối tượng mới của lớp mới được khai báo.
Radiodef

0

Chúng tôi tạo ra soyuz-to để đơn giản hóa 1 vấn đề: làm thế nào để chuyển đổi Xđể Y(ví dụ Stringđể Integer). Xây dựng của một đối tượng cũng loại chuyển đổi vì vậy nó có một chức năng đơn giản để xây dựng Map, List, Set:

import io.thedocs.soyuz.to;

List<String> names = to.list("John", "Fedor");

Vui lòng kiểm tra nó - nó có rất nhiều tính năng hữu ích khác

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.