2013-08-22 28 views
20

Chúng tôi không thể thực hiện thao tác <Collection>.add hoặc <Collection>.addAll trên các bộ sưu tập mà chúng tôi thu được từ Arrays.asList.Cách thêm các phần tử vào Danh sách khi sử dụng Arrays.asList()

Vì vậy, nếu tôi gặp phải tình huống mà tôi yêu cầu thêm Phần tử mới vào List mà không xóa các phần tử trước đó trong List?. Làm thế nào tôi có thể đạt được điều này?

+0

Tại sao bạn không thể thêm? 'asList' trả về một' new ArrayList'. Ồ, nó không giống với danh sách 'ArrayList' –

+4

@SotiriosDelimanolis được Arrays.asList trả về được hỗ trợ bởi mảng được truyền vào và không thể sửa đổi được. Từ [tài liệu] (http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#asList (T ...)) (nhấn mạnh được thêm), "Trả về ** * Danh sách kích thước cố định *** được hỗ trợ bởi mảng được chỉ định (Các thay đổi đối với danh sách trả về "ghi thông qua" vào mảng.) Phương thức này hoạt động như cầu nối giữa các API dựa trên mảng và dựa trên bộ sưu tập, kết hợp với Collection.toArray(). Danh sách trả về được tuần tự hóa và triển khai RandomAccess. " –

+0

@JoshuaTaylor Đã không nhận thấy đó là 'java.util.Arrays.ArrayList' –

Trả lời

40

Tạo mới ArrayList sử dụng constructor:

List<String> list = new ArrayList<String>(Arrays.asList("a", "b")); 
11

Một cách là để xây dựng một mới ArrayList:

List<T> list = new ArrayList<T>(Arrays.asList(...)); 

Sau khi làm điều đó, bạn có thể sửa đổi list như bạn xin vui lòng.

2

Arrays.asList(), tạo ra một danh sách mà thực sự là hậu thuẫn của một mảng và nó là một mảng được morphed như một danh sách. Bạn có thể sử dụng nó như một danh sách nhưng bạn không thể thực hiện một số thao tác trên danh sách đó như thêm các phần tử mới. Vì vậy, lựa chọn tốt nhất là để vượt qua nó để một constructor của một danh sách khác obj như thế này:

List<T> list = new ArrayList<T>(Arrays.asList(...)); 
1

Bạn có thể nhận được xung quanh trung ArrayList với Java8 suối:

Integer[] array = {1, 2, 3}; 
    List<Integer> list = Streams.concat(Arrays.stream(array), 
             Stream.of(4)).collect(Collectors.toList()); 

này nên được khá hiệu quả vì nó chỉ có thể lặp qua mảng và cũng có thể phân bổ trước danh sách đích. Nó có thể hoặc có thể không tốt hơn cho các mảng lớn. Như mọi khi, nếu nó quan trọng bạn phải đo lường.

Các vấn đề liên quan