A Collection
- bazen kap olarak da adlandırılır - birden çok öğeyi tek bir birimde gruplayan bir nesnedir. Collection
Toplam 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.2
Ve Hashtable'a JDK1.0
, hem de temsil edilen nesne grubunu temsil etmek için kullanılır <Key, Value>
çifti. Her <Key, Value>
çifte Entry
nesne denir . Girişleri koleksiyon nesnesi ile anılır HashMap
ve 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.0
Dictionary sınıfının bir alt sınıfı olan, tanıtılan eski bir sınıftır. Gönderen JDK1.2
Hashtable 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: " hash
collision
" 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
, Hashtable
Karma ç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 HashMap
olduğ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 = 8
Bağ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 = 6
dengeli 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 |
+--------------------+-----------+-------------+
Iterator
doğ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 Enumeration
arı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ı ConcurrentMap
bir 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 HashMapEntry
s 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 Hashtable
ama 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
HashMap
maksimum 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ı
Hashtable
dahili olarak senkronize edilir. Bu nedenle, Hashtable
çok iş parçacıklı uygulamalarda kullanmak çok güvenlidir . Olduğu gibi HashMap
dahili olarak senkronize edilmez. Bu nedenle, HashMap
harici senkronizasyon olmadan çok iş parçacıklı uygulamalarda kullanmak güvenli değildir . Yöntemi HashMap
kullanarak harici olarak senkronize edebilirsiniz Collections.synchronizedMap()
.
« Performans
Gibi Hashtable
içten senkronize edilir, bu yapar Hashtable
biraz daha yavaş HashMap
.
@Görmek