A Collection- bazen kap olarak da adlandırılır - birden çok öğeyi tek bir birimde gruplayan bir nesnedir. CollectionToplam verileri depolamak, almak, değiştirmek ve iletmek için kullanılır. Bir koleksiyon çerçevesi W , koleksiyonları temsil etmek ve değiştirmek için birleşik bir mimaridir.
HashMap JDK1.2Ve Hashtable'a JDK1.0, hem de temsil edilen nesne grubunu temsil etmek için kullanılır <Key, Value>çifti. Her <Key, Value>çifte Entrynesne denir . Girişleri koleksiyon nesnesi ile anılır HashMapve Hashtable. Bir koleksiyondaki anahtarlar benzersiz veya farklı olmalıdır. [eşlenmiş bir değeri belirli bir anahtar almak için kullanıldığından. bir koleksiyondaki değerler çoğaltılabilir.]
« Üst Sınıf, Eski ve Koleksiyon Çerçevesi üyesi
Hashtable, JDK1.0Dictionary sınıfının bir alt sınıfı olan, tanıtılan eski bir sınıftır. Gönderen JDK1.2Hashtable uygulamak için tasarlanmış yeniden olduğunu Harita arayüzü toplama çerçevesinin bir üyesi yapmak. HashMap, Java Collection Framework'ün kuruluşundan itibaren üyesidir JDK1.2. HashMap, AbstractMap sınıfının alt sınıfıdır.
public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, Serializable { ... }
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable { ... }
« Başlangıç kapasitesi ve Yük faktörü
Kapasite, karma tablosundaki kova sayısıdır ve ilk kapasite, karma tablonun oluşturulduğu andaki kapasitedir. Karma tablonun açık olduğuna dikkat edin: " hashcollision" durumunda, tek bir kova birden fazla girişi saklar ve bunlar ardışık olarak aranmalıdır. Yük faktörü, hash tablosunun kapasitesi otomatik olarak artırılmadan önce ne kadar dolu olmasına izin verildiğinin bir ölçüsüdür.
HashMap, varsayılan başlangıç kapasitesine (16) ve varsayılan yük faktörüne (0.75) sahip boş bir karma tablo oluşturur . Hashtable olarak varsayılan başlangıç kapasitesi (11) ve yük faktörü / dolum oranı (0.75) ile boş hashtable oluşturur .

« Karma çarpışma durumunda yapısal değişiklik
HashMap, HashtableKarma çarpışma yaşanması durumunda bunlar bağlı listelerde haritası girişlerini depolar. Java8'denHashMap karma kova belirli bir eşiğin üzerine çıkarsa, o kova geçiş yapar linked list of entries to a balanced tree. O (n) 'den O (log n)' ye en kötü durum performansını geliştirir. Listeyi ikili ağaca dönüştürürken, dallanma değişkeni olarak hashcode kullanılır. Aynı kovada iki farklı hashcode varsa, biri daha büyük olarak kabul edilir ve ağacın sağına, diğeri sola gider. Ancak her iki hashcode eşit HashMapolduğunda, anahtarların karşılaştırılabilir olduğunu varsayar ve bazı siparişlerin korunabilmesi için yönü belirlemek için anahtarı karşılaştırır. Anahtarları HashMap karşılaştırılabilir kılmak iyi bir uygulamadır . Kepçe boyutuna ulaşırsa giriş ekleme hakkındaTREEIFY_THRESHOLD = 8Bağlantılı girişler listesini dengeli bir ağaca dönüştürmek, girişleri daha az TREEIFY_THRESHOLD ve en fazla kaldırmak, UNTREEIFY_THRESHOLD = 6dengeli ağacı bağlantılı girişler listesine yeniden dönüştürmek olacaktır. Java 8 SRC , yığın dizisi
« Koleksiyon görünümü yineleme, Hızlı ve Başarısız
+--------------------+-----------+-------------+
| | Iterator | Enumeration |
+--------------------+-----------+-------------+
| Hashtable | fail-fast | safe |
+--------------------+-----------+-------------+
| HashMap | fail-fast | fail-fast |
+--------------------+-----------+-------------+
| ConcurrentHashMap | safe | safe |
+--------------------+-----------+-------------+
Iteratordoğada başarısız bir hızdır. yani, bir koleksiyon kendi remove () yönteminden başka bir yineleme sırasında değiştirilirse ConcurrentModificationException öğesini atar. Nerede olarak Enumerationarıza emniyetli doğasında. Bir koleksiyon yineleme sırasında değiştirilirse herhangi bir istisna atmaz.
Java API Dokümanlarına göre, Numaralandırma yerine Yineleyici her zaman tercih edilir.
NOT: Numaralandırma arabiriminin işlevselliği Yineleyici arabirimi tarafından çoğaltılır. Buna ek olarak, Iterator isteğe bağlı bir kaldırma işlemi ekler ve daha kısa yöntem adlarına sahiptir. Yeni uygulamalar, Numaralandırma yerine Iterator kullanmayı düşünmelidir.
In Java 5 ConcurrentMap Arayüz tanıtıldı : ConcurrentHashMap- son derece eşzamanlı, yüksek performanslı ConcurrentMapbir karma tablo tarafından yedeklenmiş uygulanmasını. Bu uygulama, alım gerçekleştirirken hiçbir zaman engellemez ve istemcinin güncellemeler için eşzamanlılık seviyesini seçmesine izin verir. Aşağıdakiler için bir yedek yedek olarak tasarlanmıştır Hashtable: uygulamaya ek olarak ConcurrentMap, tüm "eski" yöntemleri de destekler Hashtable.
Her bir HashMapEntrys değeri uçucudur, bu nedenle devam eden değişiklikler ve müteakip okumalar için ince tanecik tutarlılığı sağlar; her okuma en son tamamlanan güncellemeyi yansıtır
Yineleyiciler ve Numaralandırmalar Güvenli Değildir - yineleyici / numaralandırmanın oluşturulmasından bu yana durumu bir noktada yansıtır; bu, düşük tutarlılık pahasına eşzamanlı okumalara ve değişikliklere izin verir. ConcurrentModificationException'ı atmazlar. Ancak, yineleyiciler aynı anda yalnızca bir iş parçacığı tarafından kullanılmak üzere tasarlanmıştır.
Benzeri Hashtableama aksine HashMap, bu sınıf null değerinin anahtar veya değer olarak kullanılmasına izin vermez.
public static void main(String[] args) {
//HashMap<String, Integer> hash = new HashMap<String, Integer>();
Hashtable<String, Integer> hash = new Hashtable<String, Integer>();
//ConcurrentHashMap<String, Integer> hash = new ConcurrentHashMap<>();
new Thread() {
@Override public void run() {
try {
for (int i = 10; i < 20; i++) {
sleepThread(1);
System.out.println("T1 :- Key"+i);
hash.put("Key"+i, i);
}
System.out.println( System.identityHashCode( hash ) );
} catch ( Exception e ) {
e.printStackTrace();
}
}
}.start();
new Thread() {
@Override public void run() {
try {
sleepThread(5);
// ConcurrentHashMap traverse using Iterator, Enumeration is Fail-Safe.
// Hashtable traverse using Enumeration is Fail-Safe, Iterator is Fail-Fast.
for (Enumeration<String> e = hash.keys(); e.hasMoreElements(); ) {
sleepThread(1);
System.out.println("T2 : "+ e.nextElement());
}
// HashMap traverse using Iterator, Enumeration is Fail-Fast.
/*
for (Iterator< Entry<String, Integer> > it = hash.entrySet().iterator(); it.hasNext(); ) {
sleepThread(1);
System.out.println("T2 : "+ it.next());
// ConcurrentModificationException at java.util.Hashtable$Enumerator.next
}
*/
/*
Set< Entry<String, Integer> > entrySet = hash.entrySet();
Iterator< Entry<String, Integer> > it = entrySet.iterator();
Enumeration<Entry<String, Integer>> entryEnumeration = Collections.enumeration( entrySet );
while( entryEnumeration.hasMoreElements() ) {
sleepThread(1);
Entry<String, Integer> nextElement = entryEnumeration.nextElement();
System.out.println("T2 : "+ nextElement.getKey() +" : "+ nextElement.getValue() );
//java.util.ConcurrentModificationException at java.util.HashMap$HashIterator.nextNode
// at java.util.HashMap$EntryIterator.next
// at java.util.Collections$3.nextElement
}
*/
} catch ( Exception e ) {
e.printStackTrace();
}
}
}.start();
Map<String, String> unmodifiableMap = Collections.unmodifiableMap( map );
try {
unmodifiableMap.put("key4", "unmodifiableMap");
} catch (java.lang.UnsupportedOperationException e) {
System.err.println("UnsupportedOperationException : "+ e.getMessage() );
}
}
static void sleepThread( int sec ) {
try {
Thread.sleep( 1000 * sec );
} catch (InterruptedException e) {
e.printStackTrace();
}
}
« Boş Tuşlar ve Boş Değerler
HashMapmaksimum bir null anahtarına ve herhangi bir sayıda null değerine izin verir. As Hashtable, tek bir null anahtarına ve null değerine bile izin vermezse, anahtar veya null değeri NullPointerException atar. Misal
« Senkronize, İş Parçacığı Kasası
Hashtabledahili olarak senkronize edilir. Bu nedenle, Hashtableçok iş parçacıklı uygulamalarda kullanmak çok güvenlidir . Olduğu gibi HashMapdahili olarak senkronize edilmez. Bu nedenle, HashMapharici senkronizasyon olmadan çok iş parçacıklı uygulamalarda kullanmak güvenli değildir . Yöntemi HashMapkullanarak harici olarak senkronize edebilirsiniz Collections.synchronizedMap().
« Performans
Gibi Hashtableiçten senkronize edilir, bu yapar Hashtablebiraz daha yavaş HashMap.
@Görmek