Farklı java koleksiyonlarının neden farklı varsayılan kapasiteleri var?


11

Farklı koleksiyon kurucularına bakıldığında soru akla geliyor. ArrayList () neden başlangıç ​​kapasitesi on olan boş bir liste oluşturur ve ArrayDeque () başlangıç ​​kapasitesi 16 öğeyi tutmak için yeterli olan boş bir dizi deque oluşturur.


Yeni bir kapasite limiti yoktu. Sadece add () ile yeni öğeler ekliyorum. Her zaman çalışır.
Tulains Córdova

1
Bence ArrayList uygulaması içindeki dizinin ilk dizi boyutundan bahsediyor. Adından da anlaşılacağı gibi, ArrayList yalnızca kapakların altında düz bir eski dizidir ve geçerli dizi boyutundan daha fazla öğe eklemeye çalıştığınızda otomatik olarak daha büyük diziler oluşturur.
dsw88

1
StringBuilder varsayılan kapasitesi olan başka bir tane olduğunu düşünüyorum, 10 veya 16 mıydı?
Ingo

@Ingo İlginç. Kapasite ile uğraşan koleksiyonların dışındaki şeylerin farkında bile değildim ama sanırım mantıklı. O zaman kapasite için bir etiket yoktu, bu yüzden diğer kullanımlara çok fazla ilgi göstermedim.
Old Badman Gray

Yanıtlar:


17

Kısa cevap

Çünkü ArrayDeque kapasitesi iki güç olmalı ve 16, en az 10 olan iki güç en küçük güç olmalıdır.


ArrayDeque, dairesel gibi davranan doğrusal bir dizinin etrafını sarmak için her yerde çok sayıda% işlem kullanmalıdır.

a % ba & (b - 1) sanki b ikisinin gücü gibi ifade edilebilir . Bitsel AND büyük ölçüde daha hızlıdır, bu nedenle ArrayDeque'in kapasitesi iki güçle sınırlıdır. Tüm% işlemleri, uygulamadaki gerçek% yerine bit maskeleme ile gerçekleştirilir.

Bu nedenle, yeni HashMap'in asal sayı tablosu boyutlarını değil, ikisinin gücünü kullanmasının nedeni de budur, çünkü% işleminin çok sık ve bitsel olarak yapılması gerekiyor ve bu çok daha hızlı.

Eğer taban çizgisi 10 ise, iki sınırlama gücüne sahip yapılar 16 kullanmalıdır, çünkü en az 10 olan iki en küçük güçtür.


3

Belirli bir nedeni olmaması olasılığını dışlamayın.

Bu iki koleksiyon farklı ekipler tarafından yazılmış olabilir. Her ikisi de varsayılan kapasite olarak küçük bir sayı seçti, ancak ilk takım ondalık olarak düşündü ve 10'u seçti, ikinci takım ikili düşündü ve 16'yı seçti.


1

@ Esailija'nın cevabı bu özel durum için iyidir.

Daha genel olarak, birçok faktöre bağlı olan bir değiş tokuş. Birkaç örnek vereceğim:

  • Veri yapısı tipik olarak nasıl kullanılır ? Veri tamponları olarak kullanılan veri yapıları, tipik olarak, örneğin küçük kümeler için kullanılan veri yapılarından çok daha yüksek bir kapasiteyi tercih edecektir.
  • Hedef CPU platformunuzdaki bir önbellek satırına hangi varsayılan veri boyutu sığar ? Varsayılan önbellek satırına sığarsa performansta büyük bir fark yaratabilir. Java'da varsayılan olarak 10 seçimi, 32 bitlik 10 kelimeden oluşan bir dizinin yanı sıra dizi / nesne yükünün 64 bayt önbellek satırına sığması olabilir.
  • Alan ve çalışma zamanı verimliliğine ne kadar değer veriyorsunuz ? Daha iyi çalışma zamanı performansı istiyorsanız, daha sonra yeniden ayırmayı önlemek için daha fazla alan ayırmak genellikle daha iyidir.

Bu değiş tokuşların bir sonucu olarak, farklı toplama uygulamalarının farklı bir optimum varsayılan kapasiteye sahip olabileceği oldukça anlaşılabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.