Jadual Kandungan
Mengapakah kapasiti awal HashMap 16?
Rumah Java javaTutorial Apakah sebab mengapa kapasiti awal ArrayList di Java ialah 10?

Apakah sebab mengapa kapasiti awal ArrayList di Java ialah 10?

May 10, 2023 pm 02:19 PM
java arraylist

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;
Salin selepas log masuk

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.

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;
    }
Salin selepas log masuk

Sesetengah rakan di sini mesti mengatakan bahawa nilai lalai bagi ArrayList dalam Java 8 Saiz awal ialah 0, bukan 10. Dan anda juga akan mendapati sesuatu yang pelik tentang komen pada kaedah pembina: bina senarai kosong dengan kapasiti awal 10. Apa kejadahnya? Ia jelas kosong!

Tempah keraguan, mari kita lihat kaedah tambah ArrayList dahulu:

    public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }
Salin selepas log masuk

Kaedah ensureCapacityInternal dipanggil dalam kaedah tambah apabila memasukkan kaedah ini ialah bekas kosong pada mulanya, jadi

Masuk

:

    private void ensureCapacityInternal(int minCapacity) {
        ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
    }
Salin selepas log masuk
Dalam kaedah di atas, kapasiti dikira terlebih dahulu dengan calculateCapacity:
    private static int calculateCapacity(Object[] elementData, int minCapacity) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            return Math.max(DEFAULT_CAPACITY, minCapacity);
        }
        return minCapacity;
    }
Salin selepas log masuk

akan mendapati bahawa

ditugaskan semula kepada 10 (size=0), Lulus minCapacity=1ini

,

Berikut ialah badan kaedah: minCapacityDEFAULT_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);
    }
Salin selepas log masuk
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
Salin selepas log masuk
ArrayList mempunyai kapasiti permulaan yang sama seperti Vector, iaitu 10; Kapasiti permulaan HashMap Sama, ia adalah 16; dan HashTable menggunakan 11 sahaja, yang merupakan satu lagi soalan yang sangat menarik.

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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Arahan sembang dan cara menggunakannya
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Nombor Sempurna di Jawa Nombor Sempurna di Jawa Aug 30, 2024 pm 04:28 PM

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

Penjana Nombor Rawak di Jawa Penjana Nombor Rawak di Jawa Aug 30, 2024 pm 04:27 PM

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

Weka di Jawa Weka di Jawa Aug 30, 2024 pm 04:28 PM

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

Nombor Smith di Jawa Nombor Smith di Jawa Aug 30, 2024 pm 04:28 PM

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

Soalan Temuduga Java Spring Soalan Temuduga Java Spring Aug 30, 2024 pm 04:29 PM

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

Cuti atau kembali dari Java 8 Stream Foreach? Cuti atau kembali dari Java 8 Stream Foreach? Feb 07, 2025 pm 12:09 PM

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

TimeStamp to Date in Java TimeStamp to Date in Java Aug 30, 2024 pm 04:28 PM

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.

Program Java untuk mencari kelantangan kapsul Program Java untuk mencari kelantangan kapsul Feb 07, 2025 am 11:37 AM

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

See all articles