Có vẻ hơi muộn nhưng đây là hai xu của tôi. Chúng ta không thể có List<int>
như int
một kiểu nguyên thủy nên chúng ta chỉ có thể có List<Integer>
.
Java 8 (mảng int)
int[] ints = new int[] {1,2,3,4,5};
List<Integer> list11 =Arrays.stream(ints).boxed().collect(Collectors.toList());
Java 8 trở xuống (mảng Integer)
Integer[] integers = new Integer[] {1,2,3,4,5};
List<Integer> list21 = Arrays.asList(integers); // returns a fixed-size list backed by the specified array.
List<Integer> list22 = new ArrayList<>(Arrays.asList(integers)); // good
List<Integer> list23 = Arrays.stream(integers).collect(Collectors.toList()); //Java 8 only
Cần ArrayList và không List?
Trong trường hợp chúng tôi muốn triển khai cụ thể List
ví dụ: ArrayList
thì chúng tôi có thể sử dụng toCollection
như:
ArrayList<Integer> list24 = Arrays.stream(integers)
.collect(Collectors.toCollection(ArrayList::new));
Tại sao list21
không thể được sửa đổi cấu trúc?
Khi chúng tôi sử dụng Arrays.asList
kích thước của danh sách trả về là cố định vì danh sách được trả lại không phải java.util.ArrayList
, nhưng một lớp tĩnh riêng được xác định bên trong java.util.Arrays
. Vì vậy, nếu chúng ta thêm hoặc xóa các thành phần khỏi danh sách được trả về, một UnsupportedOperationException
sẽ được ném. Vì vậy, chúng ta nên đi với list22
khi chúng ta muốn sửa đổi danh sách. Nếu chúng ta có Java8 thì chúng ta cũng có thể đi với list23
.
Để rõ ràng list21
có thể được sửa đổi theo nghĩa mà chúng ta có thể gọi list21.set(index,element)
nhưng danh sách này có thể không được sửa đổi về mặt cấu trúc tức là không thể thêm hoặc xóa các thành phần khỏi danh sách. Bạn cũng có thể kiểm tra câu hỏi này .
Nếu chúng ta muốn một danh sách bất biến thì chúng ta có thể gói nó thành:
List<Integer> list 22 = Collections.unmodifiableList(Arrays.asList(integers));
Một điểm khác cần lưu ý là phương pháp Collections.unmodifiableList
trả về một khung nhìn không thể thay đổi của danh sách đã chỉ định. Bộ sưu tập chế độ xem không thể thay đổi là một bộ sưu tập không thể thay đổi và cũng là chế độ xem trên bộ sưu tập sao lưu. Lưu ý rằng những thay đổi đối với bộ sưu tập sao lưu vẫn có thể xảy ra và nếu chúng xảy ra, chúng có thể được nhìn thấy qua chế độ xem không thể thay đổi.
Chúng ta có thể có một danh sách thực sự bất biến trong Java 9 và 10.
Danh sách thực sự bất biến
Java 9:
String[] objects = {"Apple", "Ball", "Cat"};
List<String> objectList = List.of(objects);
Java 10 (Danh sách thực sự bất biến) theo hai cách:
List.copyOf(Arrays.asList(integers))
Arrays.stream(integers).collect(Collectors.toUnmodifiableList());
Cũng kiểm tra câu trả lời này của tôi để biết thêm.
Arrays.asList(new int[] { 1, 2, 3 })
; chắc chắn không biên dịch trong Java 1.4.2, bởi vì mộtint[]
là không mộtObject[]
.