Aslında 2 ay önce konuyla ilgili bir blog yazısı yazdım . Makale C # için List<T>
ama Java'nın ArrayList
çok benzer bir uygulaması var. Yana ArrayList
dinamik bir dizi kullanılarak uygulanır, bu talep üzerine boyutunda artar. Dolayısıyla kapasite oluşturucunun nedeni optimizasyon amaçlıdır.
Bu yeniden boyutlandırma işlemlerinden biri gerçekleştiğinde, ArrayList dizinin içeriğini eskisinin iki katı kapasiteye sahip yeni bir diziye kopyalar. Bu işlem O (n) süresinde çalışır .
Misal
Boyutun nasıl ArrayList
artacağına dair bir örnek :
10
16
25
38
58
... 17 resizes ...
198578
297868
446803
670205
1005308
Liste kapasiteli başlar Yani 10
11. madde eklenir, bu tarafından artıştır 50% + 1
için 16
. 17. maddede bu ArrayList
oran tekrar artırılır 25
. Şimdi, istenen kapasitenin zaten bilindiği bir liste oluşturduğumuz örneği düşünün 1000000
. ArrayList
Boyut oluşturucu olmadan oluşturma çağrılırArrayList.add
1000000
O (1) 'i normal olarak veya O (n) ' yi yeniden boyutlandırmada alan süreleri .
1000000 + 16 + 25 + ... + 670205 + 1005308 = 4015851 işlem
Yapıcıyı kullanarak ve ardından çağırarak bunu karşılaştırın ArrayList.add
O (1) ' de çalışacağı garanti edilen .
1000000 + 1000000 = 2000000 işlem
Java vs C #
Java yukarıdaki gibidir, 10
her boyuttan başlayarak ve yeniden boyutlandırılır 50% + 1
. C # başlar4
ve her yeniden boyutlandırmada iki katına çıkarak çok daha agresif bir şekilde artar. 1000000
C # kullanımları için yukarıdan örnek ekler 3097084
işlemleri.
Referanslar