Teknik olarak, 10
destek dizisinin tembel bir şekilde başlatılmasını kabul ederseniz, sıfır değil. Görmek:
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);
}
nerede
private static final int DEFAULT_CAPACITY = 10;
Bahsettiğiniz şey, başlangıçta boş olan tüm ArrayList
nesneler arasında paylaşılan sıfır boyutlu ilk dizi nesnesidir . Java 7'de de mevcut olan bir optimizasyonun kapasitesi tembel10
olarak garanti edilmektedir .
Kuşkusuz, müteahhit sözleşmesi tamamen doğru değil. Belki de buradaki kafa karışıklığının kaynağı budur.
Arka fon
İşte Mike Duigou'dan bir E-posta
Boş ArrayList ve HashMap yamasının güncellenmiş bir sürümünü yayınladım.
http://cr.openjdk.java.net/~mduigou/JDK-7143928/1/webrev/
Bu gözden geçirilmiş uygulama , her iki sınıfa da yeni alan getirmez. ArrayList için, destek dizisinin geç tahsisi yalnızca liste varsayılan boyutta oluşturulmuşsa gerçekleşir. Performans analizi ekibimize göre, ArrayList örneklerinin yaklaşık% 85'i varsayılan boyutta oluşturulmaktadır, bu nedenle bu optimizasyon vakaların büyük çoğunluğu için geçerli olacaktır.
HashMap için, paket dizisi gerekene kadar istenen başlangıç boyutunu izlemek için eşik alanından reklam öğesi kullanılır. Okuma tarafında, boş harita durumu isEmpty () ile test edilir. Yazma boyutunda, kova dizisini şişirme ihtiyacını saptamak için (tablo == EMPTY_TABLE) karşılaştırması kullanılır. ReadObject'te verimli bir başlangıç kapasitesi seçmeye çalışmak için biraz daha çalışma var.
Gönderen: http://mail.openjdk.java.net/pipermail/core-libs-dev/2013-April/015585.html