1. Hashtable adalah subkelas Kamus.
Copy kode kodenya sebagai berikut:
kelas publik Hashtable<K,V>
memperluas Kamus<K,V>
mengimplementasikan Peta<K,V>, Dapat Dikloning, java.io.Serializable
Peta Hash:
Copy kode kodenya sebagai berikut:
HashMap kelas publik<K,V>
memperluas Peta Abstrak<K,V>
mengimplementasikan Peta<K,V>, Dapat Dikloning, Dapat Diserialkan
HashMap dan Hashtable keduanya merupakan kelas implementasi antarmuka Peta;
2. Metode di Hashtable bersifat sinkron (), tetapi metode di HashMap tidak sinkron secara default. Artinya, dalam aplikasi multi-thread, Hashtable dapat digunakan dengan aman tanpa operasi khusus; untuk HashMap, diperlukan mekanisme sinkronisasi tambahan. Namun masalah sinkronisasi HashMap dapat diselesaikan melalui metode Koleksi statis:
Copy kode kodenya sebagai berikut:
publik statis <K,V> Peta<K,V> peta tersinkronisasi(Peta<K,V> m)
Metode ini mengembalikan Peta yang disinkronkan, yang berarti Peta yang dikembalikan aman untuk thread. Perlu dicatat bahwa saat melakukan iterasi pada peta yang dikembalikan, Anda harus menyinkronkan secara manual pada peta yang dikembalikan, jika tidak maka akan menyebabkan perilaku tidak terdefinisi:
Copy kode kodenya sebagai berikut:
Peta m = Koleksi.synchronizedMap(New HashMap());
...
Set s = m.keySet(); // Tidak perlu berada di blok tersinkronisasi
...
disinkronkan(m) {// Sinkronisasi di m, bukan di s!
Iterator i = s.iterator(); // Harus berada di blok tersinkronisasi
sementara (i.hasNext())
foo(i.berikutnya());
}
3. Di HashMap, null dapat digunakan sebagai kunci, dan hanya ada satu kunci tersebut; mungkin ada satu atau lebih kunci yang nilainya nol. Ketika metode get() mengembalikan nilai null, itu bisa berarti bahwa kunci tersebut tidak ada di HashMap, atau bisa juga berarti bahwa nilai yang terkait dengan kunci tersebut adalah nol. Oleh karena itu, di HashMap, metode get() tidak dapat digunakan untuk menentukan apakah kunci tertentu ada di HashMap, tetapi metode berisiKey() harus digunakan untuk menentukan. Nilai kunci Hashtable tidak boleh nol, jika tidak: java.lang.NullPointerException.
4.HashTable menggunakan Enumerasi, dan HashMap menggunakan Iterator.
Hal-hal di atas hanyalah perbedaan dangkal, dan penerapannya juga sangat berbeda.
5. Ukuran default array hash di HashTable adalah 11, dan metode peningkatannya adalah lama*2+1. Ukuran default array hash di HashMap adalah 16, dan harus eksponen 2.
6. Penggunaan nilai hash berbeda-beda. HashTable langsung menggunakan kode hash dari objeknya.
Copy kode kodenya sebagai berikut:
int hash = kunci.hashCode();
int indeks = (hash & 0x7FFFFFFFF) % tab.panjang;
HashMap menghitung ulang nilai hash dan menggunakan AND alih-alih modulus, seperti metode put HashMap:
Copy kode kodenya sebagai berikut:
publik V put(K kunci, nilai V) {
jika (kunci == nol)
kembalikan putForNullKey(nilai);
int hash = hash(kunci.hashCode());
int i = indexFor(hash, tabel.panjang);
for (Masuk<K,V> e = tabel[i]; e != null; e = e.selanjutnya) {
Objek k;
if (e.hash == hash && ((k = e.key) == kunci || kunci.sama dengan(k))) {
V oldValue = e.value;
e.nilai = nilai;
e.recordAccess(ini);
kembalikan Nilai lama;
}
}
modCount++;
addEntry(hash, kunci, nilai, i);
kembalikan nol;
}
Copy kode kodenya sebagai berikut:
hash int statis(int h) {
// Fungsi ini memastikan bahwa kode hash hanya berbeda berdasarkan
// kelipatan konstan pada setiap posisi bit mempunyai batas
// jumlah tabrakan (kira-kira 8 pada faktor beban default).
h^= (h >>> 20) ^ (h >>> 12);
kembali h ^ (h >>> 7) ^ (h >>> 4);
}
Copy kode kodenya sebagai berikut:
statis int indeksUntuk(int h, int panjang) {
return h & (panjang-1);
}