Saya sebenarnya menulis posting blog pada topik 2 bulan yang lalu. Artikel ini untuk C # List<T>tetapi Java ArrayListmemiliki implementasi yang sangat mirip. Karena ArrayListdiimplementasikan 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 ArrayListpeningkatan 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% + 1hingga 16. Pada item ke-17 ArrayListmeningkat lagi ke 25dan seterusnya. Sekarang perhatikan contoh di mana kami membuat daftar di mana kapasitas yang diinginkan sudah dikenal sebagai 1000000. Membuat ArrayListkonstruktor tanpa ukuran akan memanggil ArrayList.add 1000000waktu 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.addyang dijamin berjalan di O (1) .
1000000 + 1000000 = 2000000 operasi
Java vs C #
Java adalah seperti di atas, mulai 10dan meningkatkan setiap ukuran di 50% + 1. C # mulai 4dan meningkat jauh lebih agresif, dua kali lipat pada setiap ukuran. Contoh 1000000menambahkan dari atas untuk C # menggunakan 3097084operasi.
Referensi