Rumah  >  Artikel  >  Java  >  Apakah perbezaan antara Koleksi dan Peta Java?

Apakah perbezaan antara Koleksi dan Peta Java?

WBOY
WBOYke hadapan
2023-05-15 22:58:041305semak imbas

Antara muka koleksi

Koleksi ialah antara muka koleksi paling asas A Collection mewakili sekumpulan Objek, iaitu elemen Koleksi. Sesetengah Koleksi membenarkan unsur yang sama dan yang lain tidak. Beberapa jenis dan yang lain tidak. Java SDK tidak menyediakan kelas yang diwarisi secara langsung daripada Koleksi Kelas yang disediakan oleh Java SDK adalah semua "sub-antara muka" yang diwarisi daripada Koleksi, seperti Senarai dan Set.

Semua kelas yang melaksanakan antara muka Koleksi mesti menyediakan dua pembina standard: pembina tanpa parameter digunakan untuk mencipta Koleksi kosong, dan pembina dengan parameter Koleksi digunakan untuk mencipta Koleksi baharu ini mempunyai elemen yang sama seperti Koleksi yang diluluskan. Pembina yang terakhir membenarkan pengguna menyalin Koleksi.

Bagaimana untuk melintasi setiap elemen dalam Koleksi? Tidak kira jenis Koleksi sebenar, ia menyokong kaedah iterator(), yang mengembalikan iterator yang boleh digunakan untuk mengakses setiap elemen dalam Koleksi satu demi satu. Penggunaan biasa adalah seperti berikut:

Iterator it = collection.iterator(); // Dapatkan iterator
while(it.hasNext()) {
Object obj = it.next (); // Dapatkan elemen seterusnya
}

Dua antara muka yang diperoleh daripada antara muka Koleksi ialah Senarai dan Set.

Antara muka senarai

Senarai ialah Koleksi tersusun Gunakan antara muka ini untuk mengawal kedudukan sisipan setiap elemen dengan tepat. Pengguna boleh mengakses elemen dalam Senarai menggunakan indeks (kedudukan elemen dalam Senarai, serupa dengan subskrip tatasusunan), yang serupa dengan tatasusunan Java.

Tidak seperti Set yang dinyatakan di bawah, Senarai membenarkan elemen yang sama.

Selain kaedah iterator() yang diperlukan untuk antara muka Koleksi, List juga menyediakan kaedah listIterator(), yang mengembalikan antara muka ListIterator Berbanding dengan antara muka Iterator standard, ListIterator mempunyai beberapa lagi add() dan Kaedah yang serupa membenarkan menambah, memadam, menetapkan elemen dan melintasi ke hadapan atau ke belakang.

Kelas biasa yang melaksanakan antara muka Senarai termasuk LinkedList, ArrayList, Vector dan Stack.

Kelas LinkedList

LinkedList melaksanakan antara muka Senarai, membenarkan unsur nol. Selain itu, LinkedList menyediakan kaedah dapatkan, alih keluar dan sisip tambahan di kepala atau ekor LinkedList. Operasi ini membenarkan LinkedList digunakan sebagai tindanan, baris gilir atau deque.

Perhatikan bahawa LinkedList tidak mempunyai kaedah yang disegerakkan. Jika beberapa utas mengakses Senarai pada masa yang sama, mereka mesti melaksanakan penyegerakan akses sendiri. Satu penyelesaian ialah membina Senarai yang disegerakkan apabila mencipta Senarai:

Senarai senarai = Collections.synchronizedList(new LinkedList(...));

ArrayList class

ArrayList melaksanakan tatasusunan bersaiz berubah-ubah. Ia membenarkan semua elemen, termasuk null. ArrayList tidak disegerakkan.

saiz, isEmpty, get, set kaedah masa berjalan adalah malar. Walau bagaimanapun, kos kaedah tambah ialah pemalar terlunas, dan menambah n elemen memerlukan masa O(n). Kaedah lain mempunyai masa berjalan linear.

Setiap contoh ArrayList mempunyai kapasiti (Kapasiti), iaitu saiz tatasusunan yang digunakan untuk menyimpan elemen. Kapasiti ini meningkat secara automatik apabila elemen baharu ditambah, tetapi algoritma pertumbuhan tidak ditakrifkan. Apabila sejumlah besar elemen perlu dimasukkan, kaedah ensureCapacity boleh dipanggil untuk meningkatkan kapasiti ArrayList sebelum memasukkan untuk meningkatkan kecekapan sisipan.
Seperti LinkedList, ArrayList juga tidak disegerakkan.

Kelas vektor

Vektor sangat serupa dengan ArrayList, tetapi Vektor disegerakkan. Walaupun Iterator yang dicipta oleh Vector mempunyai antara muka yang sama seperti Iterator yang dicipta oleh ArrayList, kerana Vector disegerakkan, apabila Iterator dicipta dan sedang digunakan, thread lain mengubah keadaan Vektor (contohnya, menambah atau mengalih keluar beberapa elemen) , ConcurrentModificationException akan dilemparkan apabila memanggil kaedah Iterator, jadi pengecualian mesti ditangkap.

Kelas tindanan

Timbunan mewarisi daripada Vektor dan melaksanakan tindanan masuk-dahulu keluar. Stack menyediakan 5 kaedah tambahan yang membolehkan Vektor digunakan sebagai tindanan. Kaedah tolak dan pop asas, serta kaedah mengintip, dapatkan elemen di bahagian atas tindanan, kaedah kosong menguji sama ada tindanan kosong dan kaedah carian mengesan kedudukan unsur dalam tindanan. Tindanan ialah tindanan kosong selepas ia dibuat.

Tetapkan antara muka

Set ialah Koleksi yang tidak mengandungi unsur pendua, iaitu, mana-mana dua elemen e1 dan e2 mempunyai e1.equals(e2)= false, Set mempunyai paling banyak satu elemen nol.
Jelas sekali, pembina Set mempunyai kekangan bahawa parameter Koleksi yang diluluskan tidak boleh mengandungi unsur pendua.
Sila ambil perhatian: Objek Boleh Berubah mesti dikendalikan dengan berhati-hati. Jika elemen boleh ubah dalam Set mengubah keadaannya menyebabkan Object.equals(Object)=true, ia akan menyebabkan beberapa masalah.

Antara muka peta

Sila ambil perhatian bahawa Map tidak mewarisi antara muka Koleksi Map menyediakan kunci kepada pemetaan nilai. Peta tidak boleh mengandungi kunci yang sama, dan setiap kunci hanya boleh memetakan satu nilai. Antara muka Peta menyediakan tiga jenis paparan set Kandungan Peta boleh dianggap sebagai set set kunci, set set nilai atau set pemetaan nilai kunci.

Kelas Hashtable

Hashtable mewarisi antara muka Peta dan melaksanakan jadual cincang pemetaan nilai kunci. Sebarang objek bukan nol boleh digunakan sebagai kunci atau nilai.
Untuk menambah data, gunakan put(key, value) dan untuk mengalih keluar data, gunakan get(key) Kos masa bagi kedua-dua operasi asas ini adalah tetap.

Hashtable melaraskan prestasi melalui dua parameter: kapasiti awal dan faktor beban. Biasanya faktor beban lalai 0.75 mencapai keseimbangan masa dan ruang yang lebih baik. Meningkatkan faktor beban boleh menjimatkan ruang tetapi masa carian yang sepadan akan meningkat, yang akan menjejaskan operasi seperti dapatkan dan letak.

Contoh mudah menggunakan Hashtable adalah seperti berikut Letakkan 1, 2, dan 3 ke dalam Hashtable, dan kuncinya masing-masing adalah "satu", "dua", dan "tiga":
Nombor Hashtable = new Hashtable();
numbers.put(“one”, new Integer(1));
numbers.put(“dua”, new Integer(2));
nombor. put(“three ", new Integer(3));

Untuk mendapatkan nombor, seperti 2, gunakan kekunci yang sepadan:

Integer n = (Integer )numbers.get( "dua");
System.out.println("two = " + n);

Oleh kerana objek sebagai kunci akan menentukan nilai yang sepadan dengan mengiranya lokasi fungsi hash, jadi mana-mana objek yang digunakan sebagai kunci mesti melaksanakan hashCode dan kaedah yang sama. Kaedah hashCode dan equals mewarisi daripada Objek kelas akar Jika anda menggunakan kelas tersuai sebagai kunci, berhati-hati mengikut definisi fungsi cincang, jika kedua-dua objek adalah sama, iaitu, obj1.equals(. obj2)=true, maka Kod cincang mereka mestilah sama, tetapi jika dua objek berbeza, Kod cincang mereka tidak semestinya berbeza Jika Kod cincang dua objek berbeza adalah sama, fenomena ini dipanggil konflik overhed masa mengendalikan jadual cincang untuk meningkat Oleh itu, cuba tentukan kaedah hashCode() yang jelas untuk mempercepatkan operasi jadual cincang.
Jika objek yang sama mempunyai Kod cincang yang berbeza, pengendalian jadual cincang akan mempunyai hasil yang tidak dijangka (kaedah perolehan yang dijangkakan mengembalikan nol untuk mengelakkan masalah ini, anda hanya perlu mengingati satu perkara: mengatasi kaedah yang sama dan kaedah kod cincang). bukannya hanya menulis salah satu daripadanya. Hashtable adalah segerak.

Kelas HashMap

HashMap adalah serupa dengan Hashtable, kecuali HashMap adalah tak segerak dan membenarkan null, iaitu nilai null dan kunci null. , tetapi apabila menganggap HashMap sebagai Koleksi (kaedah values() boleh mengembalikan Koleksi), kos masa sub-operasi lelarannya adalah berkadar dengan kapasiti HashMap. Oleh itu, jika prestasi operasi berulang adalah sangat penting, jangan tetapkan kapasiti awal HashMap terlalu tinggi atau faktor beban terlalu rendah.

Kelas WeakHashMap

WeakHashMap ialah HashMap yang dipertingkatkan, yang melaksanakan "rujukan lemah" pada kunci Jika kunci tidak lagi dirujuk secara luaran, maka kunci itu Boleh dikitar semula oleh GC.

Atas ialah kandungan terperinci Apakah perbezaan antara Koleksi dan Peta Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam