2013-08-25 67 views
6

Xin chào mọi người. Tôi đang tạo một ứng dụng từ vựng, trong đó tôi cần tạo một List<String> (hoặc ArrayList). Để làm như vậy, tôi đã tạo ra những đoạn mã sau (chỉ là ví dụ):ArrayList tự động thêm các mục null

List<String> tempSOLUTION = new ArrayList<String>(); 
String temp = "abc123"; 
tempSOLUTION.add(temp); 

Tôi cũng đã thử như sau:

tempSOLUTION.add(new String(temp)); 

Cả hai người thêm mục vào danh sách , nhưng trong khi gỡ lỗi, tôi thấy rằng đó là mảng đã 12 đối tượng, trong đó như sau:

[abc123, null, null, null, null, null, null, null, null, null, null, null] 

vấn đề của tôi là tôi không thể có những mặt hàng null, dạng danh sách mới này là chìa khóa trên một HashableMap<String>, vì vậy bất kỳ thay đổi sẽ gây ra một ngoại lệ, vì khóa sẽ KHÔNG tồn tại.

Ảnh chụp màn hình của danh sách (tempSOLUTION) Các chi tiết sử dụng trình gỡ lỗi: http://www.pabloarteaga.es/stackoverflow.jpg

Làm thế nào tôi có thể thêm một mục vào danh sách mà không cần tạo tất cả những mặt hàng null?

Sau khi đã tìm kiếm, tôi tìm thấy một câu trả lời về cách loại bỏ các mặt hàng null, đó là:

tempSOLUTION.removeAll(Collections.singleton(null)); 

Nhưng nó không làm việc cho mục đích của tôi.

Xin cảm ơn trước.

Trả lời

15

Có thể bạn đang xem mảng nội bộ của nó bằng trình gỡ lỗi. Điều đó không quan trọng; nó chỉ là một chi tiết thực hiện.

Điều quan trọng là nội dung hiển thị thông qua API công khai của nó. Nói cách khác, những gì các cuộc gọi đến size() (và như vậy) cho bạn biết. (Và nếu điều đó không trả lại 1 trong ví dụ mã của bạn, sau đó một cái gì đó kỳ lạ đang xảy ra!)

+0

Cảm ơn bạn rất nhiều, đã giải đáp được câu hỏi của tôi :) Sẽ chấp nhận câu trả lời ngay khi hệ thống cho phép tôi. – vagaerg

6

Từ ảnh chụp màn hình của bạn rõ ràng là những gì là chính xác

[abc123, null, null, null, null, null, null, null, null, null, null, null] 

không phải là ArrayList bản thân nhưng nó biến thành viên objectData xảy ra là bộ đệm bên trong của ArrayList (nơi nó thực sự lưu trữ các phần tử bạn thêm vào nó).

Bộ đệm này có kích thước lớn hơn kích thước thực tế của ArrayList vì nếu không, mỗi lần bạn thêm phần tử mới, toàn bộ objectData sẽ được phân bổ lại thành mảng lớn hơn và tất cả các phần tử được sao chép.

Làm theo lời khuyên của Oli, chỉ cần bỏ qua chi tiết triển khai và chỉ tin tưởng giao diện.

+0

Ok, cảm ơn bạn rất nhiều. Không biết đó là cách đó. Vì vậy, nếu mảng của tôi lớn hơn 12 mục, bộ đệm đó sẽ lớn hơn? Xin lỗi vì không bỏ phiếu, nhưng tôi không có đủ đại diện. – vagaerg