Arasındaki farklar nelerdir HashMap
ve bir Hashtable
Java'da?
Dişli olmayan uygulamalar için hangisi daha verimli?
Arasındaki farklar nelerdir HashMap
ve bir Hashtable
Java'da?
Dişli olmayan uygulamalar için hangisi daha verimli?
Arasında birkaç fark var HashMap
ve Hashtable
Java’da:
Hashtable
olduğu senkronize, buna karşılık HashMap
değil. Bu yapar HashMap
Eşlenmemiş Nesneler genellikle eşitlenmemiş olanlardan daha iyi performans gösterirken, iş parçacıklı olmayan uygulamalar için daha iyidir.
Hashtable
izin vermiyor null
anahtarlar veya değerler. HashMap
birine izin verir null
anahtar ve herhangi bir sayı null
değerler.
HashMap'ın alt sınıflarından biri LinkedHashMap
Bu nedenle, öngörülebilir yineleme sırasını (varsayılan olarak ekleme sırası) istiyorsanız, kolayca takas HashMap
bir için LinkedHashMap
. Kullanıyor olmanız bu kadar kolay olmaz Hashtable
.
Senkronizasyon sizin için bir sorun olmadığı için tavsiye ederim HashMap
. Senkronizasyon bir sorun olursa, ayrıca ConcurrentHashMap
.
Yanıtların çoğunun Hashtable'ın senkronize olduğunu belirtiyor. Pratikte bu sizi çok az satın alır. Eşzamanlama, erişimci / mutator yöntemlerinde eşzamanlı olarak haritadan ekleyerek veya çıkarırken iki parçayı durduracaktır, ancak gerçek dünyada çoğu zaman ek senkronizasyona ihtiyacınız olacaktır.
Çok yaygın bir deyim "kontrol et ve sonra" yerine koymaktır - diğer bir deyişle, Harita'ya bir giriş aramalı ve eğer mevcut değilse ekleyiniz. Hashtable veya HashMap'i kullanmanızın hiçbir şekilde bir atom işlemi olmadığı anlamına gelmez.
Eşzamanlı olarak senkronize edilmiş bir HashMap şu yollarla elde edilebilir:
Collections.synchronizedMap(myMap);
Ama ihtiyacınız olan bu mantığı doğru bir şekilde uygulamak için ek senkronizasyon şeklinde:
synchronized(myMap) {
if (!myMap.containsKey("tomato"))
myMap.put("tomato", "red");
}
Haritanın ek senkronizasyon yoluyla değiştirilmesini engellemediğiniz sürece bir Hashtable'ın girişlerini (veya Collections.synchronizedMap tarafından elde edilen bir HashMap) yineleme bile güvenli değildir.
Uygulamaları ConcurrentMap arayüz (örneğin ConcurrentHashMap) Bunları dahil ederek bazılarını çöz iş parçacığı güvenli onay-sonra-eylem semantiği gibi:
ConcurrentMap.putIfAbsent(key, value);
Hashtable
eski kod olarak kabul edilir. Hakkında bir şey yok Hashtable
kullanarak yapılamaz HashMap
veya türevleri HashMap
Bu yüzden, yeni kod için, geri dönüş için herhangi bir gerekçe görmüyorum Hashtable
.
Bu soru, adayın koleksiyon sınıflarının doğru kullanımını anlayıp anlamadığını ve mevcut alternatif çözümlerden haberdar olup olmadığını kontrol etmek için görüşme sırasında sıklıkla sorulur.
Bazı Önemli Terimlerle İlgili Not
HashMap tarafından senkronize edilebilir
Map m = Collections.synchronizeMap(hashMap);
Harita, yineleme için doğrudan destek yerine Koleksiyon görünümleri sağlar Numaralandırma nesneleri ile. Koleksiyon görünümleri büyük ölçüde geliştirir Bu bölümde daha sonra ele alındığı gibi arayüzün ifadesi. Harita, anahtarlar, değerler veya anahtar / değer çiftleri üzerinde yineleme yapmanızı sağlar; Hashtable üçüncü seçeneği sağlamıyor. Harita güvenli bir yol sağlar yineleme ortasında girişleri kaldırmak için; Hashtable yapmadı. Son olarak Harita, Hashtable arayüzünde küçük bir eksikliği giderir. Hashtable, içeriğinde bulunan bir yönteme sahiptir; Hashtable belirli bir değeri içerir. İsmini göz önünde bulundurursan, bunu beklersin. Hashtable belirli bir anahtarı içeriyorsa true değerini döndürme yöntemi Anahtar, bir Hashtable için birincil erişim mekanizmasıdır. Harita arabirim, yöntemi yeniden adlandırarak bu karışıklık kaynağını ortadan kaldırır containsValue. Ayrıca, bu arayüzün tutarlılığını artırır - içerirValue parallels içerirKey.
HashMap
: Bir uygulaması Map
bir diziyi indekslemek için karma kodları kullanan arabirim.
Hashtable
: Merhaba, 1998 aradı. Koleksiyonlarının API'sini geri istiyorlar.
Cidden olsa, uzak durmaktan daha iyi olursun Hashtable
tamamen. Tek iş parçacıklı uygulamalar için, senkronizasyon ek yüküne ihtiyacınız yoktur. Son derece eşzamanlı uygulamalar için, paranoyak senkronizasyon açlık, kilitlenme veya gereksiz çöp toplama duraklamalarına yol açabilir. Tim Howland'ın işaret ettiği gibi, ConcurrentHashMap
yerine.
Unutmayın ki HashTable
Java Koleksiyonlar Çerçevesi (JCF) kullanılmadan önceki eski sınıftı ve daha sonra, Map
arayüz. Öyleydi Vector
ve Stack
.
Bu nedenle, her zaman JCF'de her zaman daha iyi bir alternatif olduğu için onlardan uzak durun. diğerleri de işaret ettiği gibi.
İşte Java koleksiyonu hile sayfası faydalı bulacaksın. Gri bloğun, eski HashTable, Vector ve Stack sınıfını içerdiğine dikkat edin.
İzb'in dediğine ek olarak, HashMap
boş değerlere izin verirken, Hashtable
değil.
Ayrıca dikkat edin Hashtable
genişletir Dictionary
sınıf olarak Javadocs devlet, eski ve yerini almıştır Map
arayüz.
Bu tabloya bir bakın. HashMap ve Hashtable ile birlikte farklı veri yapıları arasında karşılaştırmalar sağlar. Karşılaştırma kesin, açık ve anlaşılması kolay.
Hashtable
benzer HashMap
ve benzer bir arayüze sahiptir. Kullanmanız önerilir HashMap
Eski uygulamalar için desteğe ihtiyacınız olmadıkça veya senkronizasyona ihtiyacınız varsa, Hashtables
yöntemler senkronize edilir. Yani sizin durumunuzda çok iş parçacığı olmadığından HashMaps
en iyi bahistirsiniz.
Hashtable ve hashmap arasındaki bir diğer önemli fark, Hashtable'daki yineleyicinin başarısız olmasıdır. Hashtable için numaralandırıcı ise, başka bir Thread, Iterator'un kendi remove () yöntemi dışında herhangi bir öğe ekleyerek veya çıkartarak yapısal olarak değiştirirse ConcurrentModificationException öğesini atar. Ancak bu garantili bir davranış değildir ve JVM tarafından en iyi şekilde yapılacaktır. ”
Kaynağım: http://javarevisited.blogspot.com/2010/10/difference-between-hashmap-and.html