Kelas hashtable
Hashtable mewarisi antarmuka Peta dan mengimplementasikan tabel hash pemetaan nilai kunci. Objek apa pun yang bukan nol dapat digunakan sebagai kunci atau nilai.
Untuk menambahkan data, gunakan put(key,value), dan untuk menghapus data, gunakan get(key). Biaya waktu dari kedua operasi dasar ini adalah konstan.
Hashtable menyesuaikan kinerja melalui dua parameter: kapasitas awal dan faktor beban. Biasanya faktor beban default 0,75 mencapai keseimbangan yang lebih baik antara waktu dan ruang. Meningkatkan faktor muatan dapat menghemat ruang namun waktu pencarian terkait akan meningkat, yang akan memengaruhi operasi seperti ambil dan letakkan.
Contoh sederhana penggunaan Hashtable adalah sebagai berikut. Masukkan 1, 2, dan 3 ke dalam Hashtable, dan kuncinya masing-masing adalah "satu", "dua", dan "tiga":
Nomor Hashtable = Hashtable baru();
angka.put("satu", Integer baru(1));
angka.put("dua", Integer baru(2));
angka.put("tiga", Integer baru(3));
Untuk mengambil nomor, misalnya 2, gunakan tombol yang sesuai:
Bilangan bulat n = (Bilangan Bulat)angka.get(“dua”);
System.out.println(“dua = ” + n);
Karena objek yang digunakan sebagai kunci akan menentukan posisi nilai terkait dengan menghitung fungsi hashnya, objek apa pun yang digunakan sebagai kunci harus mengimplementasikan metode kode hash dan sama dengan. Metode hashCode dan same dengan yang diwarisi dari kelas root Object. Jika Anda menggunakan kelas khusus sebagai kunci, berhati-hatilah. Menurut definisi fungsi hash, jika kedua objek itu sama, yaitu obj1.equals( obj2)=true, maka kode hashnya harus sama, tetapi jika dua objek berbeda, kode hashnya belum tentu berbeda. Jika kode hash dari dua objek berbeda sama, fenomena ini disebut konflik waktu overhead pengoperasian tabel hash meningkat. Oleh karena itu, cobalah untuk mendefinisikan metode hashCode() yang terdefinisi dengan baik untuk mempercepat operasi tabel hash.
Jika objek yang sama memiliki kode hash yang berbeda, pengoperasian tabel hash akan memberikan hasil yang tidak diharapkan (metode get yang diharapkan mengembalikan null). Untuk menghindari masalah ini, Anda hanya perlu mengingat satu hal: ganti metode sama dengan dan metode kode hash secara bersamaan waktu. Jangan menulis hanya satu saja. Hashtable sinkron.
kelas HashMap
HashMap mirip dengan Hashtable, hanya saja HashMap tidak sinkron dan mengizinkan null, yaitu nilai null dan kunci null. , tetapi ketika memperlakukan HashMap sebagai Koleksi (metode nilai () dapat mengembalikan Koleksi), overhead waktu sub-operasi iterasinya sebanding dengan kapasitas HashMap. Oleh karena itu, jika kinerja operasi berulang sangat penting, jangan atur kapasitas awal HashMap terlalu tinggi atau faktor beban terlalu rendah.
Kelas HashMap yang lemah
WeakHashMap adalah HashMap yang ditingkatkan yang mengimplementasikan "referensi lemah" ke kunci. Jika kunci tidak lagi direferensikan secara eksternal, kunci tersebut dapat didaur ulang oleh GC.
HashSet silakan lihat deskripsi Set
Set adalah Koleksi yang tidak mengandung elemen duplikat, yaitu dua elemen e1 dan e2 memiliki e1.equals(e2)=false, dan Set memiliki paling banyak satu elemen null.
Konstruktor set memiliki batasan bahwa parameter Koleksi yang diteruskan tidak boleh berisi elemen duplikat.
Harap diperhatikan: Objek yang Dapat Diubah harus ditangani dengan hati-hati. Jika elemen yang bisa berubah dalam suatu Set mengubah statusnya sehingga menyebabkan Object.equals(Object)=true, hal itu akan menyebabkan beberapa masalah.
Dua implementasi Set yang umum adalah HashSet dan TreeSet. Memutuskan mana yang akan digunakan cukup mudah. HashSet jauh lebih cepat (waktu konstan vs. waktu log untuk sebagian besar operasi), tetapi tidak memberikan jaminan pemesanan. Jika Anda perlu menggunakan operasi di SortedSet, atau jika iterasi berurutan penting bagi Anda, gunakan TreeSet. Jika tidak, gunakan HashSet. Merupakan pertaruhan yang adil bagi Anda untuk tidak menggunakan HashSet sepanjang waktu.
Satu hal yang harus Anda ingat tentang HashSets adalah bahwa iterasinya linier dalam hal jumlah jumlah entri dan kapasitas. Oleh karena itu, jika kinerja iterasi penting, kapasitas awal yang sesuai harus dipilih dengan hati-hati. Memilih kapasitas yang terlalu besar akan membuang-buang ruang dan waktu. Kapasitas awal default adalah 101, yang umumnya lebih dari yang Anda perlukan. Anda dapat menggunakan konstruktor int untuk menentukan kapasitas awal. Kapasitas awal HashSet yang akan dialokasikan adalah 17:
Setel s= HashSet baru(17);
HashSets juga memiliki "parameter penyetelan" yang disebut faktor beban. Jika Anda sangat khawatir tentang penggunaan ruang HashSet Anda, baca teks HashSet untuk detailnya. Jika tidak, gunakan saja nilai default. Jika Anda menerima faktor muatan default, namun ingin menentukan kapasitas awal, pilih angka yang kira-kira dua kali lipat kapasitas yang Anda harapkan akan bertambah pada Set Anda. Jika tebakan Anda salah, itu bisa bertambah, atau hanya membuang sedikit ruang. Tapi tidak ada masalah besar. Jika Anda mengetahui nilai terbaik untuk ukuran yang benar, gunakan nilai tersebut jika Anda tidak mengetahuinya, gunakan nilai lama, atau gunakan nilai genap. Ini sebenarnya tidak terlalu penting. Hal-hal ini hanya membuat HashSet sedikit lebih baik.
TreeSet tidak memiliki parameter penyetelan. Selain kloning, HashSet dan TreeSet hanya memiliki operasi yang diperlukan oleh antarmuka masing-masing (Set dan TreeSet), dan tidak ada operasi lainnya.