Melihat berbagai konstruktor koleksi pertanyaan muncul di benak. Mengapa ArrayList () membuat daftar kosong dengan kapasitas awal sepuluh dan ArrayDeque () membuat deque array kosong dengan kapasitas awal yang cukup untuk menampung 16 elemen.
Melihat berbagai konstruktor koleksi pertanyaan muncul di benak. Mengapa ArrayList () membuat daftar kosong dengan kapasitas awal sepuluh dan ArrayDeque () membuat deque array kosong dengan kapasitas awal yang cukup untuk menampung 16 elemen.
Jawaban:
Karena kapasitas ArrayDeque harus menjadi kekuatan dua, dan 16 adalah kekuatan terkecil dari dua yang setidaknya 10.
ArrayDeque perlu menggunakan banyak operasi% di mana-mana untuk membungkus array linier yang berpura-pura bundar.
a % b
dapat dinyatakan seolah- a & (b - 1)
olah b
adalah kekuatan dua. Bitwise AND secara besar-besaran lebih cepat sehingga kapasitas ArrayDeque dibatasi menjadi kekuatan dua. Semua% operasi dilakukan dengan bitmasking, bukan% aktual dalam implementasi.
Ini juga mengapa HashMap yang lebih baru tidak menggunakan ukuran tabel bilangan prima tetapi kekuatan dua , lagi karena operasi% perlu dilakukan begitu sering dan bitwise dan itu jauh lebih cepat.
Jadi jika garis dasarnya adalah 10, maka struktur yang memiliki kekuatan dua batasan harus menggunakan 16 karena itu kekuatan terkecil dari dua yang setidaknya 10.
Jangan mengecualikan kemungkinan bahwa tidak ada alasan khusus.
Bisa jadi kedua koleksi ini telah ditulis oleh tim yang berbeda. Keduanya memilih angka kecil sebagai kapasitas default, tetapi tim pertama berpikir secara desimal dan memilih 10, sedangkan tim kedua berpikir biner dan memilih 16.
Jawaban @ Esailija baik untuk kasus khusus ini.
Lebih umum lagi, ini merupakan trade-off yang tergantung pada banyak faktor. Saya akan memberikan beberapa contoh:
Sebagai hasil dari pertukaran ini, dapat dimengerti bahwa implementasi pengumpulan yang berbeda mungkin memiliki kapasitas default optimal yang berbeda.