Saya sebenarnya menulis posting blog pada topik 2 bulan yang lalu. Artikel ini untuk C # List<T>
tetapi Java ArrayList
memiliki implementasi yang sangat mirip. Karena ArrayList
diimplementasikan menggunakan array dinamis, ukurannya bertambah sesuai permintaan. Jadi alasan konstruktor kapasitas adalah untuk keperluan optimasi.
Ketika salah satu dari operasi resizings ini terjadi, ArrayList menyalin isi dari array ke dalam array baru yang dua kali kapasitas dari yang lama. Operasi ini berjalan dalam waktu O (n) .
Contoh
Berikut adalah contoh bagaimana ArrayList
peningkatan ukuran:
10
16
25
38
58
... 17 resizes ...
198578
297868
446803
670205
1005308
Jadi daftar dimulai dengan kapasitas 10
, ketika item ke-11 ditambahkan itu meningkat 50% + 1
hingga 16
. Pada item ke-17 ArrayList
meningkat lagi ke 25
dan seterusnya. Sekarang perhatikan contoh di mana kami membuat daftar di mana kapasitas yang diinginkan sudah dikenal sebagai 1000000
. Membuat ArrayList
konstruktor tanpa ukuran akan memanggil ArrayList.add
1000000
waktu yang membutuhkan O (1) secara normal atau O (n) pada pengubahan ukuran.
1000000 + 16 + 25 + ... + 670205 + 1005308 = 4015851 operasi
Bandingkan ini menggunakan konstruktor dan kemudian panggilan ArrayList.add
yang dijamin berjalan di O (1) .
1000000 + 1000000 = 2000000 operasi
Java vs C #
Java adalah seperti di atas, mulai 10
dan meningkatkan setiap ukuran di 50% + 1
. C # mulai 4
dan meningkat jauh lebih agresif, dua kali lipat pada setiap ukuran. Contoh 1000000
menambahkan dari atas untuk C # menggunakan 3097084
operasi.
Referensi