Apakah sebab mengapa kapasiti awal ArrayList di Java ialah 10?
Mengapakah kapasiti awal HashMap 16?
Apabila bercakap tentang kapasiti permulaan ArrayList, kita mesti menyemak kapasiti permulaan HashMap terlebih dahulu. Berikut ialah kod sumber Java 8 sebagai contoh Terdapat dua faktor yang berkaitan dalam HashMap: kapasiti pemulaan dan faktor pemuatan:
/** * The default initial capacity - MUST be a power of two. */ static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 /** * The load factor used when none specified in constructor. */ static final float DEFAULT_LOAD_FACTOR = 0.75f;
Dalam HashMap, kapasiti permulaan lalai tatasusunan ialah 16. Apabila data diisi kepada kapasiti lalai 0.75 Apabila, ia akan dikembangkan sebanyak 2 kali. Sudah tentu, pengguna juga boleh memasukkan saiz yang ditentukan semasa permulaan. Tetapi perlu diingatkan bahawa lebih baik menggunakan nilai 2 kepada kuasa ke-n Jika ia tidak ditetapkan kepada kuasa ke-2, HashMap juga akan menukarnya, tetapi ia akan mengambil satu langkah lagi.
Mengenai prinsip pelaksanaan HashMap, saya tidak akan menerangkan secara terperinci di sini sudah terlalu banyak artikel di Internet tentang perkara ini. Satu perkara yang perlu kita ketahui ialah algoritma HashMap untuk mengira koordinat nilai utama, iaitu dengan mencincang nilai kunci dan kemudian memetakannya ke koordinat dalam tatasusunan.
Pada masa ini, pastikan kapasiti HashMap adalah 2 hingga kuasa ke-n Kemudian operasi bit boleh digunakan untuk mengendalikan memori secara terus semasa operasi cincang tanpa menukar kepada perpuluhan, dan kecekapan akan lebih tinggi.
Secara amnya, boleh dianggap bahawa sebab HashMap menggunakan kuasa 2 hingga ke-n dan nilai lalai ialah 16, mempunyai pertimbangan berikut:
-
Kurangkan perlanggaran cincang;
Tingkatkan kecekapan pertanyaan Peta; 🎜>
Peruntukan yang berlebihan membazirkan sumber;- Ringkasnya, sebab HashMap menggunakan 16 sebagai nilai lalai adalah untuk mengurangkan perlanggaran cincang dan meningkatkan kecekapan.
- Adakah kapasiti awal ArrayList 10? Seterusnya, mari kita sahkan dahulu sama ada kapasiti awal ArrayList ialah 10, dan kemudian bincangkan mengapa ia adalah nilai ini.
Mari kita lihat dahulu kod sumber kapasiti permulaan ArrayList dalam Java 8:
/**
* Default initial capacity.
*/
private static final int DEFAULT_CAPACITY = 10;
Salin selepas log masuk
Jelas sekali, nilai permulaan kontena lalai ialah 10. Dan daripada JDK1.2 hingga JDK1.6, nilai ini sentiasa 10. /** * Default initial capacity. */ private static final int DEFAULT_CAPACITY = 10;
Bermula dari JDK1.7, apabila memulakan ArrayList, nilai lalai dimulakan kepada tatasusunan kosong:
/** * Shared empty array instance used for default sized empty instances. We * distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when * first element is added. */ private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; /** * Constructs an empty list with an initial capacity of ten. */ public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; }
Tempah keraguan, mari kita lihat kaedah tambah ArrayList dahulu:
public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; }
Masuk
:private void ensureCapacityInternal(int minCapacity) { ensureExplicitCapacity(calculateCapacity(elementData, minCapacity)); }
private static int calculateCapacity(Object[] elementData, int minCapacity) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { return Math.max(DEFAULT_CAPACITY, minCapacity); } return minCapacity; }
ditugaskan semula kepada 10 (size=0
), Lulus minCapacity=1
ini
Berikut ialah badan kaedah: minCapacity
DEFAULT_CAPACITY=10
private void ensureExplicitCapacity(int minCapacity) { modCount++; // overflow-conscious code if (minCapacity - elementData.length > 0) grow(minCapacity); } private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); }
ensureExplicitCapacity(minCapacity);
Kaedah tumbuh dalam kod di atas digunakan untuk mengendalikan pengembangan, dan kapasiti dikembangkan kepada 1.5 kali ganda daripada asal. minCapacity=10
Memahami aliran pemprosesan di atas, kami akan mendapati bahawa pada asasnya kapasiti awal ArrayList masih 10, tetapi ia hanya menggunakan pemuatan malas Ini adalah pengoptimuman yang dilakukan oleh Java 8 untuk menjimatkan memori. Oleh itu, dari awal hingga akhir, kapasiti awal ArrayList ialah 10. Berikut ialah satu lagi sebutan tentang faedah pemuatan malas Apabila terdapat beribu-ribu ArrayLists dalam program, saiz lalai 10 objek bermakna 10 penunjuk (40 atau 80) diperuntukkan kepada tatasusunan asas apabila dibuat. . Jika anda dengan malas boleh memulakan tatasusunan, anda boleh menjimatkan banyak ruang memori. Perubahan dalam Java 8 adalah untuk tujuan di atas.
Mengapakah kapasiti awal ArrayList 10? Akhir sekali, mari kita bincangkan mengapa kapasiti awal ArrayList ialah 10. Malah boleh dikatakan tiada sebab, cuma "terasa" sahaja, tidak terlalu besar, tidak terlalu kecil, sesuai untuk mata! Pertama sekali, apabila membincangkan HashMap, kami mengatakan bahawa sebab mengapa HashMap memilih kuasa 2 hingga ke-n adalah lebih kepada mempertimbangkan prestasi dan perlanggaran algoritma cincang. Masalah ini tidak wujud untuk ArrayList. ArrayList hanyalah tatasusunan mudah berkembang, tanpa mengambil kira pengoptimuman peringkat algoritma. Selagi ia melebihi nilai tertentu, ia boleh berkembang. Oleh itu, secara teorinya, kapasiti ArrayList boleh menjadi sebarang nilai positif. Dokumentasi ArrayList tidak menjelaskan mengapa 10 dipilih, tetapi kemungkinan besar disebabkan oleh pertimbangan padanan terbaik antara kehilangan prestasi dan kehilangan ruang. 10. Ia tidak terlalu besar atau terlalu kecil Ia tidak akan membazirkan terlalu banyak ruang memori dan tidak akan menjejaskan prestasi terlalu banyak. Jika anda perlu bertanya mengapa 10 dipilih pada mulanya, anda mungkin perlu bertanya kepada pengarang kod ini "Josh Bloch".Jika anda melihat dengan teliti, anda juga akan menemui beberapa nombor kapasiti permulaan menarik yang lain:
ArrayList-10 Vector-10 HashSet-16 HashMap-16 HashTable-11
Atas ialah kandungan terperinci Apakah sebab mengapa kapasiti awal ArrayList di Java ialah 10?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Panduan Nombor Sempurna di Jawa. Di sini kita membincangkan Definisi, Bagaimana untuk menyemak nombor Perfect dalam Java?, contoh dengan pelaksanaan kod.

Panduan untuk Penjana Nombor Rawak di Jawa. Di sini kita membincangkan Fungsi dalam Java dengan contoh dan dua Penjana berbeza dengan contoh lain.

Panduan untuk Weka di Jawa. Di sini kita membincangkan Pengenalan, cara menggunakan weka java, jenis platform, dan kelebihan dengan contoh.

Panduan untuk Nombor Smith di Jawa. Di sini kita membincangkan Definisi, Bagaimana untuk menyemak nombor smith di Jawa? contoh dengan pelaksanaan kod.

Dalam artikel ini, kami telah menyimpan Soalan Temuduga Spring Java yang paling banyak ditanya dengan jawapan terperinci mereka. Supaya anda boleh memecahkan temuduga.

Java 8 memperkenalkan API Stream, menyediakan cara yang kuat dan ekspresif untuk memproses koleksi data. Walau bagaimanapun, soalan biasa apabila menggunakan aliran adalah: bagaimana untuk memecahkan atau kembali dari operasi foreach? Gelung tradisional membolehkan gangguan awal atau pulangan, tetapi kaedah Foreach Stream tidak menyokong secara langsung kaedah ini. Artikel ini akan menerangkan sebab -sebab dan meneroka kaedah alternatif untuk melaksanakan penamatan pramatang dalam sistem pemprosesan aliran. Bacaan Lanjut: Penambahbaikan API Java Stream Memahami aliran aliran Kaedah Foreach adalah operasi terminal yang melakukan satu operasi pada setiap elemen dalam aliran. Niat reka bentuknya adalah

Panduan untuk TimeStamp to Date di Java. Di sini kita juga membincangkan pengenalan dan cara menukar cap waktu kepada tarikh dalam java bersama-sama dengan contoh.

Kapsul adalah angka geometri tiga dimensi, terdiri daripada silinder dan hemisfera di kedua-dua hujungnya. Jumlah kapsul boleh dikira dengan menambahkan isipadu silinder dan jumlah hemisfera di kedua -dua hujungnya. Tutorial ini akan membincangkan cara mengira jumlah kapsul yang diberikan dalam Java menggunakan kaedah yang berbeza. Formula volum kapsul Formula untuk jumlah kapsul adalah seperti berikut: Kelantangan kapsul = isipadu isipadu silinder Dua jumlah hemisfera dalam, R: Radius hemisfera. H: Ketinggian silinder (tidak termasuk hemisfera). Contoh 1 masukkan Jejari = 5 unit Ketinggian = 10 unit Output Jilid = 1570.8 Unit padu menjelaskan Kirakan kelantangan menggunakan formula: Kelantangan = π × r2 × h (4
