Về mặt kỹ thuật, nó 10
, không phải là 0, nếu bạn thừa nhận việc khởi tạo mảng hỗ trợ một cách lười biếng. Xem:
public boolean add(E e) {
ensureCapacityInternal(size + 1);
elementData[size++] = e;
return true;
}
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
Ở đâu
/**
* Default initial capacity.
*/
private static final int DEFAULT_CAPACITY = 10;
Những gì bạn đang đề cập đến chỉ là đối tượng mảng ban đầu có kích thước bằng 0 được chia sẻ giữa tất cả ArrayList
các đối tượng trống ban đầu . Tức là dung lượng của 10
được đảm bảo một cách lười biếng , một sự tối ưu hóa cũng có trong Java 7.
Phải thừa nhận rằng hợp đồng xây dựng không hoàn toàn chính xác. Có lẽ đây là nguồn gốc của sự nhầm lẫn ở đây.
Lý lịch
Đây là một E-Mail của Mike Duigou
Tôi đã đăng một phiên bản cập nhật của bản vá ArrayList và HashMap trống.
http://cr.openjdk.java.net/~mduigou/JDK-7143928/1/webrev/
Việc triển khai sửa đổi này không giới thiệu trường mới cho cả hai lớp. Đối với ArrayList, việc phân bổ lười biếng của mảng hỗ trợ chỉ xảy ra nếu danh sách được tạo ở kích thước mặc định. Theo nhóm phân tích hiệu suất của chúng tôi, khoảng 85% phiên bản ArrayList được tạo ở kích thước mặc định, do đó, việc tối ưu hóa này sẽ có hiệu lực đối với phần lớn các trường hợp.
Đối với HashMap, việc sử dụng quảng cáo được thực hiện bằng trường ngưỡng để theo dõi kích thước ban đầu được yêu cầu cho đến khi cần mảng nhóm. Ở phía đọc, trường hợp bản đồ trống được kiểm tra với isEmpty (). Trên kích thước ghi, so sánh với (table == EMPTY_TABLE) được sử dụng để phát hiện sự cần thiết phải tăng cường mảng xô. Trong readObject, có thêm một số công việc để cố gắng chọn một dung lượng ban đầu hiệu quả.
Từ: http://mail.openjdk.java.net/pipermail/core-libs-dev/2013-April/015585.html