Như đã nêu trong các câu trả lời khác, mảng không thể đạt được 2^31 mục nhập. Các loại dữ liệu khác bị hạn chế hoặc bằng cách này hoặc chúng có khả năng sẽ báo cáo sai kích thước của chúng() cuối cùng. Tuy nhiên, các giới hạn lý thuyết này không thể đạt được trên một số hệ thống:
Trên hệ thống 32 bit, số byte có sẵn không bao giờ vượt quá 2^32 chính xác. Và đó là giả định rằng bạn không có hệ điều hành nào chiếm bộ nhớ.Một con trỏ 32 bit là 4 byte. Bất kỳ thứ gì không dựa vào mảng phải bao gồm ít nhất một con trỏ cho mỗi mục nhập: điều này có nghĩa là số lượng mục nhập tối đa là 2^32/4 hoặc 2^30 cho những thứ không sử dụng mảng.
Một mảng đồng bằng có thể đạt được giới hạn lý thuyết của nó, nhưng chỉ một mảng byte, một mảng ngắn có chiều dài 2^31-1 sẽ sử dụng hết khoảng 2^32 + 38 byte.
Một số máy ảo Java đã giới thiệu một mô hình bộ nhớ mới sử dụng con trỏ được nén. Bằng cách điều chỉnh sự liên kết của con trỏ, hơi nhiều hơn 2^32 byte có thể được tham chiếu với 32 con trỏ byte. Khoảng bốn lần nữa. Điều này là đủ để làm cho một kích thước LinkedList() trở thành tiêu cực, nhưng không đủ để cho phép nó quấn quanh không.
Hệ thống sáu mươi bốn bit có sáu mươi bốn bit con trỏ, làm cho tất cả các con trỏ trở nên lớn gấp hai lần, làm cho các mảng không phải mảng trở nên mập mờ hơn. Điều này cũng có nghĩa là công suất tối đa được hỗ trợ nhảy tới 2^64 byte chính xác. Điều này là đủ cho một mảng 2D để đạt được tối đa lý thuyết của nó. byte [0x7fffffff] [0x7fffffff] sử dụng bộ nhớ xấp xỉ bằng 40 + 40 * (2^31-1) + (2^31-1) (2^31-1) = 40 + 40 (2^31-1) + (2^62-2^32 + 1)
'HashMap' sử dụng mảng cho tra cứu _first_. Nhưng nếu va chạm chính xảy ra, chúng sẽ được lưu trong danh sách liên kết. Do đó, một 'HashMap' có thể chứa nhiều hơn các phần tử' Integer.MAX_VALUE' - theo một cách không thể đoán trước. –
Đối với LinkedList (thực sự là điều này cho tất cả các List), hàm 'get (int)' cũng chấp nhận một số nguyên, có nghĩa là bạn không thể sử dụng nó để lấy các phần tử. Trong mọi trường hợp, tôi sẽ không đặt cược vào LinkedList hoạt động như mong đợi ở trên Integer.MAX_VALUE. – Thirler
Giới hạn cho HashMap là hệ số tải * một tỷ. Sau thời điểm này nó sẽ không phát triển mảng cơ bản. Một Vector sẽ không phát triển thành Integer.MAX_VALUE, bạn sẽ phải tạo ra vectơ có kích thước này là dung lượng ban đầu. (không) 'kích thước()' tài liệu mà Integer.MAX_VALUE được trả về cho các kích thước lớn hơn này, do đó, kích thước() cho LinkedList không phải là sai IMHO. –