Perbandingan beberapa cara untuk menilai unsur -unsur hashmap, hashset, treemap, dan treeset yang sama di java
1.1 Hashmap
Pertama -tama mari kita lihat bagaimana elemen disimpan dalam hashmap. Setiap elemen yang disimpan dalam peta adalah pasangan nilai kunci seperti nilai kunci, dan ditambahkan melalui metode put. Selain itu, kunci yang sama hanya akan memiliki nilai yang terkait dengannya di peta. Metode put didefinisikan dalam peta sebagai berikut.
V put (key k, nilai v);
Ini digunakan untuk menyimpan pasangan nilai kunci seperti nilai kunci. Nilai pengembalian adalah nilai lama yang disimpan di peta oleh kunci. Jika tidak ada sebelumnya, itu akan mengembalikan nol. Beginilah metode Hashmap Put diimplementasikan.
public v put (key k, nilai v) {if (key == null) return putfornullKey (nilai); int hash = hash (kunci); int i = indexfor (hash, table.length); untuk (entri <k, v> e = tabel [i]; e! = null; e = e.next) {objek k; if (e.hash == hash && ((k = e.key) == key || key.equals (k))) {v oldValue = E.Value; E.Value = nilai; E.RecordAccess (ini); Kembalikan OldValue; }} modcount ++; addentry (hash, kunci, nilai, i); kembali nol; }Dari hal di atas kita dapat melihat bahwa ketika menambahkan kombinasi nilai kunci yang sesuai, jika kunci yang sesuai sudah ada, nilai yang sesuai akan diubah secara langsung dan nilai lama akan dikembalikan. Saat menilai apakah kunci ada, kode hash dari kunci pertama kali dibandingkan, dan kemudian kode hash dari kunci dibandingkan dengan setara atau setara. Kami mungkin tidak dapat melihatnya di sini. Dari kode di atas, kami membandingkan kode hashcode dari MAP.Entry dan HashCode of Key. Faktanya, kita dapat melihat bahwa kode hash.entry sebenarnya adalah kode hash dari kuncinya. Jika tombol yang sesuai tidak ada pada awalnya, AddEntry akan dipanggil untuk menambahkan nilai kunci yang sesuai ke peta. Hash parameter yang dilewati oleh addEntry adalah kode hash yang sesuai dengan kunci. Selanjutnya, mari kita lihat definisi metode AddEntry.
void addEntry (int hash, K key, nilai v, int bucketIndex) {if ((size> = threshold) && (null! = Table [bucketIndex])) {ubah ukuran (2 * table.length); hash = (null! = key)? hash (kunci): 0; bucketIndex = indexfor (hash, table.length); } createEntry (hash, kunci, nilai, bucketindex); } void createEntry (int hash, K key, v nilai, int bucketIndex) {entri <k, v> e = tabel [bucketIndex]; tabel [bucketIndex] = entri baru <> (hash, kunci, nilai, e); ukuran ++; }Inti dari AddEntry adalah memanggil CreateEntry untuk membuat peta. Objek Enterry yang mewakili nilai kunci yang sesuai dan menyimpannya. Jelas, tabel di atas adalah array peta. Map.entry menggunakan hash properti untuk menyimpan kode hash dari kunci yang sesuai. Mari kita lihat konstruktor MAP.Entry dipanggil di atas.
Entri (int h, k k, v v, entri <k, v> n) {value = v; Berikutnya = n; kunci = k; hash = h; }Jelas, ini menyimpan kode hash yang sesuai dengan kunci, nilai, dan kunci yang sesuai.
Setelah memahami bagaimana elemen toko hashmap, lebih mudah untuk melihat bagaimana elemen toko hashmap. Ada dua metode utama dalam hashmap untuk menentukan apakah elemennya sama. Salah satunya adalah menentukan apakah kunci itu sama, dan yang lainnya adalah menentukan apakah nilainya sama. Bahkan, ketika memperkenalkan bagaimana elemen hashmap menyimpan elemen, kami telah memperkenalkan bagaimana hashmap menentukan apakah kunci elemennya sama. Artinya, pertama -tama, kode hash adalah sama, dan kedua, tombolnya sama atau sama. Penentuan apakah kunci itu sama dalam peta dilakukan melalui metode containskey (), dan implementasinya dalam hashmap adalah sebagai berikut.
Boolean publik berisiKey (kunci objek) {return getEntry (key)! = null; } entri akhir <k, v> getEntry (kunci objek) {int hash = (key == null)? 0: hash (kunci); untuk (entri <k, v> e = tabel [indexfor (hash, table.length)]; e! = null; e = e.next) {objek k; if (e.hash == hash && ((k = e.key) == key || (key! = null && key.equals (k)))) return e; } return null; }Jelas bahwa pertama -tama menentukan apakah kode hash dari kunci adalah sama, dan kemudian menentukan apakah kunci tersebut sama atau sama.
Nilai yang digunakan dalam MAP dinilai dengan metode ContainSValue, dan implementasinya dalam HashMap adalah sebagai berikut.
public boolean berisi value (nilai objek) {if (value == null) return containsnullValue (); Entri [] tab = tabel; untuk (int i = 0; i <tab mengembalikan false; }Jelas, nilai bentuk non-null dinilai dengan sama dengan nilai, dan bentuk nol selama itu sama, yaitu, nilai dalam elemen yang disimpan adalah nol.
1.2 Hashset
Setelah mengetahui bagaimana hashmap menyimpan elemen dan menentukan apakah elemen sama, lebih mudah untuk melihat bagaimana hashset menentukan apakah elemennya sama.
Elemen -elemen dalam hashset sebenarnya disimpan melalui hashmap. Setiap objek hashset memegang referensi ke objek hashmap yang sesuai. Saat menambahkan dan menghapus elemen ke hashset, itu dilakukan melalui hashmap yang dipegangnya. Saat menyimpan elemen, itu akan menyimpan elemen yang sesuai sebagai kunci hashmap yang dipegang. Nilai yang sesuai adalah objek konstan, jadi ketika menyimpannya, ia menggunakan logika untuk menentukan apakah elemennya sama. Saat menentukan apakah suatu elemen disertakan, itu juga memanggil metode ContainsKey dari hashmap yang diadakan untuk membuat penilaian.
Boolean publik berisi (objek o) {returnmap.containskey (o); }Teman -teman yang tertarik dapat memeriksa kode sumber Hashset.
1.3 TreeMap
Elemen -elemen yang disimpan di TreeMap dipesan dan diurutkan sesuai dengan kunci. TreeMap memiliki dua cara untuk menyortir elemen yang disimpan. Salah satunya adalah memilah -milah pembanding yang dipegangnya, dan yang lainnya adalah memilah -milah kunci yang mengimplementasikan antarmuka yang sebanding. Metode pertama lebih disukai. Ketika pembanding yang ditahan (default adalah nol) adalah nol, metode kedua digunakan. TreeMap memiliki beberapa konstruktor, di mana pembanding yang dipegang dapat diinisialisasi. Pertama -tama mari kita lihat bagaimana TreeMap menyimpan elemen. Metode put diimplementasikan sebagai berikut.
public v put (key k, nilai v) {entri <k, v> t = root; if (t == null) {bandingkan (key, key); // type (dan kemungkinan null) periksa root = entri baru <> (tombol, nilai, null); ukuran = 1; modcount ++; kembali nol; } int cmp; Entri <k, v> orang tua; // pembanding split dan pembanding jalur yang sebanding <? super k> cpr = pembanding; if (cpr! = null) {do {parent = t; cmp = cpr.compare (key, t.key); if (cmp <0) t = t.left; elseif (cmp> 0) t = t.right; lain return t.setValue (nilai); } while (t! = null); } else {if (key == null) lempar nullpointerException (); Sebanding <? super k> k = (sebanding <? super k>) kunci; lakukan {parent = t; CMP = K.COMPARETO (T.Key); if (cmp <0) t = t.left; elseif (cmp> 0) t = t.right; lain return t.setValue (nilai); } while (t! = null); } Entri <k, v> e = entri baru <> (tombol, nilai, induk); if (cmp <0) parent.left = e; lain Parent.right = e; fixafterinsersion (e); ukuran ++; modcount ++; kembali nol; }Dari implementasi di atas kita dapat melihat bahwa elemen pertama akan disimpan secara langsung. Elemen -elemen berikut dibagi menjadi dua situasi, satu adalah kasus di mana pembanding yang diadakan tidak kosong, dan yang lainnya adalah kasus di mana pembanding yang diadakan kosong. Ketika pembanding tidak kosong, pembanding akan menentukan lokasi elemen yang tersimpan. Satu hal yang penting adalah bahwa ketika hasil membandingkan kunci elemen yang ada dengan kunci elemen yang tersimpan saat ini adalah 0, akan dipertimbangkan bahwa kunci elemen yang saat ini disimpan sudah ada di peta asli, dan kemudian nilai yang sesuai dengan kunci asli diubah ke nilai baru, dan kemudian nilai lama dikembalikan secara langsung. Ketika pembanding yang ditahan kosong, lokasi elemen akan ditentukan oleh metode compareto dari kunci yang mengimplementasikan antarmuka yang sebanding. Satu hal yang mirip dengan menggunakan pembanding adalah bahwa ketika kunci asli dibandingkan dengan kunci yang baru disimpan adalah 0, akan dipertimbangkan bahwa kunci yang baru disimpan sudah ada di peta asli, dan nilai kunci asli yang sesuai akan diubah secara langsung, dan pasangan nilai kunci tidak akan lagi disimpan. Faktanya, logika implementasi utama dari metode ContainsKey yang menentukan apakah elemen ada serupa, dan implementasi spesifik adalah sebagai berikut.
Boolean publik berisiKey (kunci objek) {return getEntry (key)! = null; } entri akhir <k, v> getEntry (tombol objek) {// Versi berbasis pembanding yang tidak muatan demi kinerja if (comparator! = null) return getEntryeSingComparator (key); if (key == null) dilemparkan nullpointerException (); Sebanding <? super k> k = (sebanding <? super k>) kunci; Entri <k, v> p = root; while (p! = null) {int cmp = k.compareto (p.key); if (cmp <0) p = p. left; elseif (cmp> 0) p = p.right; lain mengembalikan p; } return null; }Karena logika TreeMap untuk menentukan apakah ada suatu elemen adalah untuk menentukan apakah hasilnya setelah membandingkan pembanding atau sebanding adalah 0, kita harus sangat berhati -hati saat menggunakan TREEMAP untuk mengimplementasikan beberapa logika yang mirip dengan elemen yang sama.
Logika TreeMap mengandung nilai adalah untuk menentukan apakah nilai yang sesuai sama? Mirip dengan hashmap. Teman yang tertarik dapat memeriksa kode sumber TreeMap.
1.4 Treeset
Treeeset juga merupakan implementasi set. Elemen yang disimpan tidak diulang dan dipesan. Secara default, elemen yang disimpan harus mengimplementasikan antarmuka yang sebanding, karena secara default, elemen akan dibandingkan sebagai objek yang sebanding. Treeset juga dapat digunakan untuk membandingkan elemen yang disimpan di dalamnya melalui pembanding. Ini dapat dicapai dengan lulus dalam objek pembanding atau TreeMap yang memegang objek pembanding saat membangun sebuah pohon. Implementasi Treeset mirip dengan Hashset. Ini juga memegang referensi ke peta, tetapi tidak merujuk pada hashmap, tetapi TreeMap. Penambahan dan penghapusan elemen di Treeset semuanya diimplementasikan oleh TreeMap yang mereka pegang. Oleh karena itu, mirip dengan hashset, cara untuk menentukan apakah unsur -unsur di Treeset adalah sama konsisten dengan TreeMap, dan juga ditentukan melalui pembanding atau sebanding, daripada metode setara tradisional. Teman yang tertarik dapat memeriksa kode sumber Treeset.
Terima kasih telah membaca, saya harap ini dapat membantu Anda. Terima kasih atas dukungan Anda untuk situs ini!