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 ArrayListdinamik 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 ArrayListartacağına dair bir örnek :
10
16
25
38
58
... 17 resizes ...
198578
297868
446803
670205
1005308
Liste kapasiteli başlar Yani 1011. madde eklenir, bu tarafından artıştır 50% + 1için 16. 17. maddede bu ArrayListoran tekrar artırılır 25. Şimdi, istenen kapasitenin zaten bilindiği bir liste oluşturduğumuz örneği düşünün 1000000. ArrayListBoyut 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, 10her 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. 1000000C # kullanımları için yukarıdan örnek ekler 3097084işlemleri.
Referanslar