HashMap ve Hashtable aras─▒ndaki farklar?


Al─▒nan cevaba git


Java'daki a HashMap ve a Hashtable aras─▒ndaki farklar nelerdir ?

Di┼čli olmayan uygulamalar i├žin hangisi daha verimli?


3572









Cevap say─▒s─▒n─▒ say: 30






Java aras─▒nda HashMap ve Hashtable i├žinde ├že┼čitli farkl─▒l─▒klar vard─▒r :

  1. Hashtable bir senkronize oysa HashMap de─čildir. HashMap Senkronize olmayan Nesneler tipik olarak senkronize olanlardan daha iyi performans g├Âsterdi─činden, di┼čli olmayan uygulamalar i├žin bu daha iyi hale gelir .

  2. Hashtable null tu┼člara veya de─čerlere izin vermez . HashMap bir null tu┼ča ve herhangi bir say─▒daki null de─čere izin verir .

  3. HashMap'in alt s─▒n─▒flar─▒ndan biri LinkedHashMap , tahmin edilebilir yineleme s─▒ras─▒n─▒ (varsay─▒lan olarak ekleme s─▒ras─▒ olan) istedi─činiz durumlarda HashMap , a LinkedHashMap . Kullan─▒yor olsayd─▒n, bu kadar kolay olmazd─▒ Hashtable .

Senkronizasyon sizin i├žin bir sorun olmad─▒─č─▒ i├žin tavsiye ederim HashMap . Senkronizasyon bir sorun haline gelirse, ayr─▒ca bakabilirsiniz ConcurrentHashMap .


3618







Cevaplar─▒n ├žo─čunun Hashtable'─▒n senkronize edildi─čini belirtdi─čini unutmay─▒n. Uygulamada bu sizi ├žok az sat─▒n al─▒r. Senkronizasyon eri┼čimci / mutator y├Ântemleri ├╝zerindedir, e┼čzamanl─▒ olarak haritadan ekleyen veya ├ž─▒kartan iki i┼č par├žac─▒─č─▒n─▒ durduracakt─▒r, ancak ger├žek d├╝nyada ├žo─ču zaman ek senkronizasyona ihtiyac─▒n─▒z olacakt─▒r.

├çok yayg─▒n bir deyim "kontrol sonra koymak" - yani i├žinde bir giri┼č aray─▒n Map ve hen├╝z mevcut de─čilse ekleyin. Bu, Hashtable ya da kullanman─▒z─▒n hi├žbir ┼čekilde bir atomik i┼člem de─čildir HashMap .

E┼čit olarak senkronize bir HashMap ┼čekilde ┼ču ┼čekilde elde edilebilir:

 Collections.synchronizedMap(myMap);
 

Ancak bu mant─▒─č─▒ do─čru ┼čekilde uygulamak i├žin formun ek senkronizasyonuna ihtiyac─▒n─▒z vard─▒r :

 synchronized(myMap) {
    if (!myMap.containsKey("tomato"))
        myMap.put("tomato", "red");
}
 

Bir Hashtable giri┼čleri (veya HashMap taraf─▒ndan elde edilenleri) yinelemek bile , ek senkronizasyon yoluyla de─či┼čtirilmekten Collections.synchronizedMap korunmad─▒─č─▒n─▒z s├╝rece, iplik g├╝venli de─čildir Map .

Uygulamalar─▒ ConcurrentMap (├Ârne─čin aray├╝z├╝ ConcurrentHashMap ) da dahil olmak ├╝zere, bu baz─▒ ├ž├Âzmek iplik g├╝venli bir ara sonra-hareket semantik gibi:

 ConcurrentMap.putIfAbsent(key, value);
 

644







Hashtable eski kod olarak kabul edilir. Hashtable Bunun kullan─▒m─▒ HashMap veya t├╝revleri kullan─▒larak yap─▒lamayan hi├žbir ┼čey yoktur HashMap , bu y├╝zden yeni kod i├žin geri d├Ânmenin bir gerek├žesi g├Âremiyorum Hashtable .


338







Bu soruya, m├╝lakatta aday─▒n koleksiyon s─▒n─▒flar─▒n─▒n do─čru kullan─▒m─▒n─▒ anlay─▒p anlamad─▒─č─▒n─▒ ve mevcut alternatif ├ž├Âz├╝mlerin fark─▒nda olup olmad─▒─č─▒n─▒ kontrol etmesi istenir.

  1. HashMap s─▒n─▒f─▒, senkronize olmama ve bo┼č de─čerlere izin vermesi d─▒┼č─▒nda, kabaca Hashtable'a e┼čde─čerdir. (HashMap bo┼č de─čerlere anahtar ve de─čer olarak izin verir, Hashtable bo┼č de─čerlere izin vermez).
  2. HashMap, haritan─▒n s─▒ras─▒n─▒n zamanla sabit kalaca─č─▒n─▒ garanti etmez.
  3. HashMap senkronize de─čil, Hashtable senkronize edildi.
  4. Hashtable'daki numaralay─▒c─▒ de─čilken HashMap'teki yineleyici hataya kar┼č─▒ g├╝venli de─čildir ve e─čer herhangi bir ba┼čka i┼č par├žac─▒─č─▒ haritay─▒ yap─▒sal olarak de─či┼čtirirse, Yineleyici'nin kendi remove () y├Ântemi d─▒┼č─▒nda herhangi bir ├Â─če ekleyerek veya kald─▒rarak ConcurrentModificationException komutunu verir. Ancak bu, garantili bir davran─▒┼č de─čildir ve JVM taraf─▒ndan en iyi gayretle yap─▒lacakt─▒r.

Baz─▒ ├ľnemli Terimlerle ─░lgili Not

  1. Senkronize, sadece bir i┼č par├žac─▒─č─▒n─▒n bir karma tablosunu bir anda de─či┼čtirebilece─či anlam─▒na gelir. Temel olarak, bir karma tablo ├╝zerinde bir g├╝ncelleme yapmadan ├Ânce herhangi bir i┼č par├žac─▒─č─▒n─▒n nesnenin ├╝zerinde bir kilit elde etmek zorunda kalaca─č─▒, di─čerlerinde kilidin serbest b─▒rak─▒lmas─▒n─▒ bekleyece─či anlam─▒na gelir.
  2. Ar─▒za g├╝venli─či, yineleyiciler ba─člam─▒nda ilgilidir. Bir toplama nesnesinde bir yineleyici yarat─▒ld─▒ysa ve di─čer baz─▒ i┼č par├žac─▒─č─▒ "yap─▒sal olarak" toplama nesnesini de─či┼čtirmeye ├žal─▒┼č─▒rsa, e┼čzamanl─▒ bir de─či┼čiklik istisnas─▒ at─▒l─▒r. Di─čer i┼č par├žac─▒klar─▒ i├žin "set" y├Ântemini ├ža─č─▒rmak m├╝mk├╝nd├╝r, ├ž├╝nk├╝ "yap─▒sal olarak" koleksiyonu de─či┼čtirmez. Ancak, "set" ├ža─čr─▒lmadan ├Ânce, koleksiyon yap─▒sal olarak de─či┼čtirilmi┼čse, "IllegalArgumentException" at─▒lacakt─▒r.
  3. Yap─▒sal modifikasyon, haritan─▒n yap─▒s─▒n─▒ etkili bir ┼čekilde de─či┼čtirebilecek ├Â─čeyi silmek veya eklemek anlam─▒na gelir.

HashMap taraf─▒ndan senkronize edilebilir

Map m = Collections.synchronizeMap(hashMap);

Harita, Numaraland─▒rma nesneleri yoluyla yineleme i├žin do─črudan destek yerine Koleksiyon g├Âr├╝n├╝mleri sa─člar. Koleksiyon g├Âr├╝n├╝mleri, bu b├Âl├╝mde daha sonra tart─▒┼č─▒ld─▒─č─▒ gibi aray├╝z├╝n etkileyicili─čini b├╝y├╝k ├Âl├ž├╝de art─▒rmaktad─▒r. Harita, anahtarlar, de─čerler veya anahtar / de─čer ├žiftleri ├╝zerinde yineleme yapman─▒z─▒ sa─člar; Hashtable ├╝├ž├╝nc├╝ se├žene─či sunmuyor. Harita, yinelemenin ortas─▒nda giri┼čleri kald─▒rmak i├žin g├╝venli bir yol sa─člar; Hashtable yapmad─▒. Son olarak, Harita Hashtable aray├╝z├╝ndeki k├╝├ž├╝k bir eksikli─či giderir. Hashtable, Hashtable belirli bir de─čer i├žeriyorsa true d├Ând├╝ren i├žeren bir y├Ântem i├žerir. Ad─▒ verilen, Hashtable verilen bir anahtar i├žeriyorsa, bu y├Ântemin true d├Ând├╝rmesini beklersiniz, ├ž├╝nk├╝ anahtar bir Hashtable i├žin birincil eri┼čim mekanizmas─▒d─▒r. Harita aray├╝z├╝ bu kar─▒┼č─▒kl─▒k kayna─č─▒n─▒ ortadan kald─▒rarak, methodValue metodunu yeniden adland─▒r─▒r. Ayr─▒ca, bu arabirimin tutarl─▒l─▒─č─▒n─▒ art─▒r─▒r - includeValue paralellikleri i├žerirKey.

Harita Arabirimi


170







HashMap : Map Diziyi dizine almak i├žin karma kodlar─▒ kullanan aray├╝z├╝n bir uygulamas─▒ . Hashtable : Merhaba, 1998 denir. Koleksiyon API'lerini geri istiyorlar.

Cidden, Hashtable tamamen uzak durmakta daha iyisin . Tek i┼č par├žac─▒kl─▒ uygulamalar i├žin, fazladan bir senkronizasyon ek y├╝k├╝ne ihtiyac─▒n─▒z yoktur. ├çok e┼č zamanl─▒ uygulamalar i├žin paranoyak senkronizasyon a├žl─▒k, kilitlenme veya gereksiz ├ž├Âp toplama duraklamalar─▒na neden olabilir. Tim Howland'─▒n i┼čaret etti─či gibi, ConcurrentHashMap onun yerine kullanabilirsiniz .


122







HashTable Java Collections Framework (JCF) tan─▒t─▒lmadan ├Ânce eski s─▒n─▒f oldu─čunu ve daha sonra Map aray├╝z├╝ uygulamak i├žin daha sonra uyarland─▒─č─▒n─▒ unutmay─▒n . ├ľyleydi Vector ve Stack .

Bu nedenle, JCF'de di─čerlerinin de belirtti─či gibi her zaman daha iyi bir alternatif oldu─čundan, daima yeni kodlardan uzak durun .

─░┼čte yararl─▒ bulabilece─činiz Java koleksiyonu kopya sayfas─▒ . Gri blo─čun eski HashTable, Vector ve Stack s─▒n─▒f─▒n─▒ i├žerdi─čine dikkat edin.


g├Âr├╝nt├╝ tan─▒m─▒n─▒ buraya girin


117







Daha ├Ânce yay─▒nlanm─▒┼č bir├žok iyi cevap var. Birka├ž yeni nokta ekliyorum ve ├Âzetliyorum.

HashMap ve Hashtable her ikisi de verileri anahtar ve de─čer bi├žiminde saklamak i├žin kullan─▒l─▒r . Her ikisi de benzersiz anahtarlar─▒ saklamak i├žin karma tekni─či kullan─▒yor. Ancak HashMap ve Hashtable s─▒n─▒flar─▒ aras─▒nda a┼ča─č─▒da verilen bir├žok fark vard─▒r.

HashMap

  1. HashMap senkronize edilmedi. ─░┼č par├žac─▒─č─▒ g├╝venli de─čildir ve uygun senkronizasyon kodu olmadan bir├žok i┼č par├žac─▒─č─▒ aras─▒nda payla┼č─▒lamaz.
  2. HashMap bir bo┼č anahtar ve ├žoklu bo┼č de─čerlere izin verir.
  3. HashMap JDK 1.2'de tan─▒t─▒lan yeni bir s─▒n─▒ft─▒r.
  4. HashMap h─▒zl─▒.
  5. HashMap Bu kodu arayarak senkronize edilenleri yapabiliriz.
    Map m = Collections.synchronizedMap(HashMap);
  6. HashMap yineleyici taraf─▒ndan ge├žilir.
  7. Yineleyici giri┼č HashMap h─▒zl─▒.
  8. HashMap AbstractMap s─▒n─▒f─▒n─▒ devral─▒r.

hashtable'a

  1. Hashtable senkronize edildi. ─░┼č par├žac─▒─č─▒ i├žin g├╝venli ve bir├žok i┼č par├žac─▒─č─▒ ile payla┼č─▒labilir.
  2. Hashtable bo┼č bir anahtar veya de─čere izin vermiyor.
  3. Hashtable eski bir s─▒n─▒ft─▒r.
  4. Hashtable yava┼č.
  5. Hashtable dahili olarak senkronize edilir ve senkronize edilemez.
  6. Hashtable Numaraland─▒r─▒c─▒ ve Yineleyici taraf─▒ndan ge├žilir.
  7. Numaraland─▒r─▒c─▒ girildi, Hashtable h─▒zl─▒ de─čil.
  8. Hashtable S├Âzl├╝k s─▒n─▒f─▒n─▒ devral─▒r.

Ek okuma Java'daki HashMap ve Hashtable aras─▒ndaki fark nedir?


g├Âr├╝nt├╝ tan─▒m─▒n─▒ buraya girin


66







─░zbÔÇÖin s├Âyledi─čine ek olarak HashMap , bo┼č de─čerlere izin verir, oysa Hashtable s├Âylemez.

Ayr─▒ca , Javadocs durumu olarak kullan─▒lan s─▒n─▒f─▒ Hashtable geni┼čleten ve bunun yerine arabirim kullan─▒ld─▒─č─▒n─▒ unutmay─▒n. Dictionary http://java.sun.com/j2se/1.4.2/docs/api/java/util/Dictionary.html Map


62







Bu tabloya bir g├Âz at─▒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─▒ kolayd─▒r.

Java Koleksiyon Matrisi


54







Hashtable benzer HashMap ve benzer bir aray├╝ze sahiptir. Kullanman─▒z ├Ânerilir HashMap E─čer eski uygulamalar i├žin destek gerektiren veya gibi, senkronizasyon gerekmedik├že, Hashtables y├Ântemler senkronize edilir. ├ľyleyse, ├žok i┼č par├žac─▒─č─▒ olmad─▒─č─▒n HashMaps i├žin senin en iyisin.


47







Hashtable ve hashmap aras─▒ndaki bir di─čer ├Ânemli fark, HashMap'taki yineleyicinin ba┼čar─▒s─▒z olmas─▒ ve Hashtable i├žin numaraland─▒r─▒c─▒n─▒n ba┼čar─▒s─▒z olmas─▒ ve herhangi bir ba┼čka i┼č par├žac─▒─č─▒, haritay─▒ yap─▒sal olarak de─či┼čtirerek, herhangi bir ├Â─čeyi Iterator'─▒n remove () y├Ântemi d─▒┼č─▒nda herhangi bir ├Â─če ekleyerek veya kald─▒rarak ConcurrentModificationException ile atmas─▒d─▒r. Ancak bu garantili bir davran─▒┼č de─čildir ve JVM taraf─▒ndan en iyi gayretle yap─▒lacakt─▒r. "

Kayna─č─▒m: http://javarevisited.blogspot.com/2010/10/difference-between-hashmap-and.html


34







Burada belirtilen di─čer t├╝m ├Ânemli hususlar─▒n yan─▒ s─▒ra, Koleksiyonlar APIÔÇÖs─▒ (├Ârn. Harita aray├╝z├╝) her zaman Java ├Âzelliklerine yap─▒lan en yeni ve en b├╝y├╝k eklentilere uyacak ┼čekilde de─či┼čtiriliyor.

├ľrne─čin, Java 5 Harita yinelemesini kar┼č─▒la┼čt─▒r─▒n:

 for (Elem elem : map.keys()) {
  elem.doSth();
}
 

Eski Hashtable yakla┼č─▒m─▒na kar┼č─▒:

 for (Enumeration en = htable.keys(); en.hasMoreElements(); ) {
  Elem elem = (Elem) en.nextElement();
  elem.doSth();
}
 

Java 1.8'de, eski eski betik dillerinde oldu─ču gibi HashMaps'i olu┼čturup bunlara eri┼čebilece─čimize de s├Âz veriyoruz:

 Map<String,Integer> map = { "orange" : 12, "apples" : 15 };
map["apples"];
 

G├╝ncelleme: Hay─▒r, 1.8'de inmeyecekler ... :(

Project Coin'in koleksiyonundaki geli┼čtirmeler JDK8'de mi olacak?


34


2012-01-12





  • HashTable senkronize edilir, e─čer tek bir dizide kullan─▒yorsan─▒z , senkronize edilmemi┼č bir versiyon olan HashMap'i kullanabilirsiniz . Senkronize olmayan nesneler genellikle biraz daha performansl─▒d─▒r. Bu arada, birden fazla i┼č par├žac─▒─č─▒ ayn─▒ anda bir HashMap'e eri┼čiyorsa ve i┼č par├žac─▒─č─▒ndan en az biri haritay─▒ yap─▒sal olarak de─či┼čtirirse, harici olarak senkronize edilmesi gerekir. Youn, senkronize edilmemi┼č bir haritay─▒ a┼ča─č─▒dakileri kullanarak senkronize edilmi┼č bir haritan─▒n i├žine sarabilir:

     Map m = Collections.synchronizedMap(new HashMap(...));
     
  • HashTable bo┼č olmayan bir nesneyi yaln─▒zca bir anahtar veya bir de─čer olarak i├žerebilir. HashMap bir bo┼č anahtar ve bo┼č de─čerler i├žerebilir.

  • Harita taraf─▒ndan d├Ând├╝r├╝len yineleyiciler hatas─▒zd─▒r, e─čer harita yineleyici olu┼čturulduktan sonra herhangi bir zamanda yap─▒sal olarak de─či┼čtirilirse, yineleyicinin kendi kald─▒rma y├Ântemi d─▒┼č─▒nda herhangi bir ┼čekilde yineleyici bir atar ConcurrentModificationException . Bu nedenle, e┼čzamanl─▒ de─či┼čiklik kar┼č─▒s─▒nda, yineleyici gelecekte belirsiz bir zamanda keyfi, deterministik olmayan bir davran─▒┼č riski almak yerine h─▒zl─▒ ve temiz bir ┼čekilde ba┼čar─▒s─▒z olur. Oysa Hashtable'─▒n anahtarlar─▒n─▒n d├Ând├╝rd├╝─č├╝ Numaralamalar ve eleman metotlar─▒ h─▒zl─▒ de─čildir.

  • HashTable ve HashMap, Java Collections FrameworkÔÇÖ├╝n bir ├╝yesidir (Java 2 platformu v1.2ÔÇÖden beri HashTable, Harita aray├╝z├╝n├╝ uygulamak i├žin yeniden uyarlanm─▒┼čt─▒r).

  • HashTable, eski kod olarak kabul edilir, belgeler g├╝venli bir ┼čekilde e┼čzamanl─▒ bir uygulama isteniyorsa, Hashtable yerine ConcurrentHashMap'i kullanman─▒z─▒ ├Ânerir .

  • HashMap, elemanlar─▒n iade edilme s─▒ras─▒n─▒ garanti etmez. HashTable i├žin san─▒r─▒m ayn─▒ ama tamamen emin de─čilim, a├ž─▒k├ža ifade eden bir kaynak bulam─▒yorum.


28







HashMap ve Hashtable ayr─▒ca ├Ânemli algoritmik farkl─▒l─▒klar var. Bundan ├Ânce kimse bundan bahsetmedi, bu y├╝zden onu b├╝y├╝t├╝yorum. HashMap iki boyut g├╝c├╝nde bir karma tablo olu┼čturacak, dinamik olarak herhangi bir kovada en fazla sekiz elemente (├žarp─▒┼čma) sahip olacak ve elementleri genel eleman tipleri i├žin ├žok iyi bir ┼čekilde kar─▒┼čt─▒racak ┼čekilde artt─▒racakt─▒r. Bununla birlikte, Hashtable uygulama ne yapt─▒─č─▒n─▒z─▒ biliyorsan─▒z, karma alma ├╝zerinde daha iyi ve daha iyi bir kontrol sa─člar; yani tablo boyutunu, ├Ârne─čin, etki alan─▒ boyutunuza en yak─▒n asal say─▒y─▒ kullanarak d├╝zeltebilirsiniz ve bu, HashMap'ten daha iyi bir performansa, yani daha az ├žarp─▒┼čmaya neden olur. Baz─▒ durumlar i├žin.

Bu soruda geni┼č ├Âl├ž├╝de tart─▒┼č─▒lan belirgin farkl─▒l─▒klardan ayr─▒ olarak, Hashtable'─▒ karma ve daha iyi performans g├Âsterecek olan "otomatik s├╝r├╝c├╝" kar┼č─▒l─▒─č─▒ olarak HashMap ├╝zerinde daha iyi kontrol sahibi oldu─čunuz bir "manuel s├╝r├╝c├╝" otomobil olarak g├Âr├╝yorum.


28







Hashtable e┼čzamanl─▒ de─čil, HashMap ise de─čil. Bu Hashtable'─▒ Hashmap'ten daha yava┼č yapar.

I┼č par├žac─▒kl─▒ olmayan uygulamalar i├žin, i┼člevsellik a├ž─▒s─▒ndan ayn─▒ olduklar─▒ndan HashMap kullan─▒n.


25


2008-09-02





Buradaki bilgilere g├Âre , HashMap ile gitmeyi tavsiye ederim. Bence en b├╝y├╝k avantaj, yineleyici boyunca yapmad─▒─č─▒n─▒z s├╝rece, Java'n─▒n yineleme yaparken de─či┼čtirmenizi engelleyece─čidir.


23







A Collection - bazen bir kapsay─▒c─▒ olarak adland─▒r─▒l─▒r - basit bir ┼čekilde birden fazla eleman─▒ tek bir ├╝nitede gruplayan bir nesnedir. Collection s, toplu verileri depolamak, almak, i┼člemek ve iletmek i├žin kullan─▒l─▒r. Bir koleksiyonlar ├žer├ževesi W , koleksiyonlar─▒ temsil etmek ve de─či┼čtirmek i├žin birle┼čtirilmi┼č 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 . Koleksiyondaki anahtarlar benzersiz veya ay─▒rt edici olmal─▒d─▒r. [Haritalanm─▒┼č bir de─čeri belirli bir anahtar almak i├žin kullan─▒l─▒rlar. koleksiyondaki de─čerler ├žo─čalt─▒labilir.]


┬ź S├╝per s─▒n─▒f, Eski ve Koleksiyon ├çer├ževe ├╝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, giri┼č tarihinden itibaren Java Koleksiyon ├çer├ževesi ├╝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 { ... }
 

┬ź ─░lk kapasite ve Y├╝k fakt├Âr├╝

Kapasite, karma tablosundaki kovalar─▒n say─▒s─▒d─▒r ve ilk kapasite, karma tablonun yarat─▒ld─▒─č─▒ andaki kapasitedir. Karma tablonun a├ž─▒k oldu─čuna dikkat edin: " hash collision " durumunda, tek bir kova s─▒rayla aranmas─▒ gereken birden fazla giri┼či saklar. Y├╝k fakt├Âr├╝, karma tablosunun kapasitesi otomatik olarak artt─▒r─▒lmadan ├Ânce ne kadar s├╝rede dolmas─▒na izin verildi─činin bir ├Âl├ž├╝s├╝d├╝r.

HashMap, varsay─▒lan ba┼člang─▒├ž ÔÇőÔÇőkapasitesi (16) ve varsay─▒lan y├╝k fakt├Âr├╝ (0.75) ile bo┼č bir karma tablo olu┼čturur . Hashtable'─▒n in┼ča etti─či yerlerde, varsay─▒lan ba┼člang─▒├ž ÔÇőÔÇőkapasitesi (11) ve y├╝k fakt├Âr├╝ / doldurma oran─▒ (0.75) olan bo┼č bir karma tablo .


Hash Haritas─▒ ve Hashtable

┬ź 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. E─čer karma kova belirli bir e┼či─čin ├Âtesine ge├žerse Java8'den HashMap bu kova de─či┼čecektir linked list of entries to a balanced tree . bu da O (n) 'den O (log n)' ye en k├Ât├╝ durum performans─▒n─▒ artt─▒r─▒r. Listeyi ikili a─čaca d├Ân├╝┼čt├╝r├╝rken, hashcode dallanma de─či┼čkeni olarak kullan─▒l─▒r. Ayn─▒ kovada iki farkl─▒ hash kodu varsa, biri daha b├╝y├╝k olarak kabul edilir ve a─čac─▒n sa─č─▒na, di─čeri sola gider. Ancak her iki karma kod da e┼čit HashMap oldu─čunda, tu┼člar─▒n kar┼č─▒la┼čt─▒r─▒labilir oldu─čunu varsayar ve baz─▒ s─▒ralar─▒n korunabilmesi i├žin y├Ân├╝ belirlemek i├žin anahtar─▒ kar┼č─▒la┼čt─▒r─▒r. HashMap Kar┼č─▒la┼čt─▒r─▒labilir anahtarlar─▒ yapmak iyi bir uygulamad─▒r . Kova b├╝y├╝kl├╝─č├╝ TREEIFY_THRESHOLD = 8 ba─članm─▒┼č giri┼čler listesine dengeli bir a─čaca d├Ân├╝┼čt├╝r├╝l├╝rse, giri┼čleri eklerken , giri┼čleri dengelenmi┼č bir a─ča├žtan giri┼člerden daha az TREEIFY_THRESHOLD ve en fazla kald─▒rmak, UNTREEIFY_THRESHOLD = 6 dengeli a─čac─▒ ba─člant─▒l─▒ giri┼čler listesine d├Ân├╝┼čt├╝r├╝r. Java 8 SRC , y─▒─č─▒n y─▒─č─▒n─▒

┬ź Koleksiyon g├Âr├╝n├╝m yineleme, Fail-Fast ve Fail-Safe

     +--------------------+-----------+-------------+
    |                    | Iterator  | Enumeration |
    +--------------------+-----------+-------------+
    | Hashtable          | fail-fast |    safe     |
    +--------------------+-----------+-------------+
    | HashMap            | fail-fast | fail-fast   |
    +--------------------+-----------+-------------+
    | ConcurrentHashMap  |   safe    |   safe      |
    +--------------------+-----------+-------------+
 

Iterator do─čada ba┼čar─▒s─▒z h─▒zl─▒. yani, e─čer bir koleksiyonu kendi remove () metodundan ba┼čka bir yineleme yaparken de─či┼čtirilmi┼čse ConcurrentModificationException '─▒ f─▒rlat─▒r. Enumeration Do─čada ba┼čar─▒s─▒z g├╝venli oldu─ču gibi . Bir yineleme i┼člemi s─▒ras─▒nda bir koleksiyon de─či┼čtirilirse, herhangi bir istisna atmaz.

Java API Docs'a g├Âre, Yineleyici her zaman Numaraland─▒rma yerine tercih edilir.

NOT: Numaraland─▒rma arabiriminin i┼člevselli─či, Yineleyici arabirimi taraf─▒ndan ├žo─čalt─▒lm─▒┼čt─▒r. Ek olarak, Iterator iste─če ba─čl─▒ bir ├ž─▒karma i┼člemi ekler ve daha k─▒sa y├Ântem adlar─▒na sahiptir. Yeni uygulamalar Numaraland─▒rma tercihinde ─░terat├Âr 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, geri al─▒m ger├žekle┼čtirirken hi├žbir zaman engellenmez ve m├╝┼čterinin g├╝ncellemeler i├žin e┼čzamanl─▒l─▒k d├╝zeyini se├žmesine izin verir. A┼ča─č─▒dakilerin yerine ge├žmesi ama├žlanm─▒┼čt─▒r Hashtable : Uygulamaya ek olarak ConcurrentMap , kendine ├Âzg├╝ t├╝m "eski" y├Ântemleri de destekler Hashtable .

  • Her birinin HashMapEntry de─čeri de─či┼čkendir, bu nedenle devam eden de─či┼čiklikler ve sonraki okumalar i├žin ince tane tutarl─▒l─▒─č─▒ sa─člar; her okuma en son tamamlanan g├╝ncellemeyi yans─▒t─▒r

  • Yineleyiciler ve Numaraland─▒rmalar G├╝venli De─čildir - yineleyicinin / numaraland─▒rman─▒n olu┼čturulmas─▒ndan bu yana bir noktada durumu yans─▒t─▒r; bu, d├╝┼č├╝k tutarl─▒l─▒k pahas─▒na e┼čzamanl─▒ okumalar ve modifikasyonlar sa─člar. ConcurrentModificationException atmazlar. Ancak, yineleyiciler ayn─▒ anda yaln─▒zca bir i┼č par├žac─▒─č─▒ taraf─▒ndan kullan─▒lmak ├╝zere tasarlanm─▒┼čt─▒r.

  • Gibi Hashtable ama aksine HashMap , bu s─▒n─▒f null'un bir 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 bo┼č anahtar ve herhangi bir say─▒da bo┼č de─čere izin verir. Nerede olarak Hashtable anahtar veya de─čer bo┼č o NullPointerException atar sonra ise, hatta tek bir bo┼č anahtar ve bo┼č de─čer izin vermez. ├ľrnek

┬ź Senkronize, G├╝venli Konu

Hashtable dahili olarak senkronize edilir. Bu nedenle, Hashtable ├žok di┼čli uygulamalarda kullanmak ├žok g├╝venlidir . Nerede olarak HashMap i├žten senkronize edilmez. Bu nedenle, HashMap harici senkronizasyon olmadan ├žoklu di┼čli uygulamalarda kullanmak g├╝venli de─čildir . D─▒┼čar─▒dan y├Ântemi HashMap kullanarak senkronize edebilirsiniz Collections.synchronizedMap() .

┬ź Performans

Gibi Hashtable i├žten senkronize edilir, bu yapar Hashtable biraz daha yava┼č HashMap .


@G├Ârmek


22


2018-01-04





Di┼čli uygulamalar i├žin, performans gereksinimlerinize ba─čl─▒ olarak ConcurrentHashMap ile s─▒k s─▒k kurtulabilirsiniz.


17







1. Hashmap ve HashTable her ikisi de anahtar ve de─čeri depolar.

2. Hashmap bir anahtar olarak saklayabilirsiniz null . Hashtable saklayam─▒yorum null .

3. HashMap senkronize edilmedi ancak Hashtable senkronize edildi.

4. HashMap ile senkronize edilebilir Collection.SyncronizedMap(map)

 Map hashmap = new HashMap();

Map map = Collections.SyncronizedMap(hashmap);
 

16







Hali haz─▒rda zikredilen farkl─▒l─▒klardan, Java 8 yana oldu─čunu belirtmek gerekir HashMap dinamik y├╝ksek karma ├žarp─▒┼čmalar, en k├Ât├╝ durumda bulunsa bile, b├Âylece, TreeNodes (k─▒rm─▒z─▒-siyah a─čac─▒) ile her bir b├Âl├╝mdeki kullan─▒lan d├╝─č├╝mleri (ba─člant─▒l─▒ liste) yerini al─▒r zaman arama oldu─čunu

HashMap Vs O (n) i├žin O (log (n)) de─čerini girin Hashtable .

* Yukar─▒da belirtilen iyile┼čtirme i├žin uygulanmam─▒┼čt─▒r Hashtable yok, ama sadece HashMap , LinkedHashMap ve ConcurrentHashMap .

FYI, ┼ču anda,

  • TREEIFY_THRESHOLD = 8 : e─čer bir kova 8'den fazla d├╝─č├╝m i├žeriyorsa, ba─člant─▒l─▒ liste dengeli bir a─čaca d├Ân├╝┼čt├╝r├╝l├╝r.
  • UNTREEIFY_THRESHOLD = 6 : bir kova ├žok k├╝├ž├╝k oldu─čunda (kald─▒r─▒lmas─▒ veya yeniden boyutland─▒r─▒lmas─▒ndan dolay─▒) a─ča├ž tekrar ba─člant─▒l─▒ listeye d├Ân├╝┼čt├╝r├╝l├╝r.

15







HashTable ve HashMaps ile 5 temel fark var.

  1. Haritalar, anahtarlar─▒, de─čerleri ve hem de anahtar-de─čer ├žiftlerini yinelemenizi ve alman─▒z─▒ sa─člar, HashTable'─▒n t├╝m bu ├Âzelliklere sahip olmad─▒─č─▒ durumlarda.
  2. Hashtable'da, kullan─▒m─▒ ├žok kafa kar─▒┼čt─▒r─▒c─▒ olan bir i┼člevi () vard─▒r. ├ç├╝nk├╝ i├žeri─čin anlam─▒ hafif sapmad─▒r. Anahtar i├žeriyor mu, de─čer i├žeriyor mu? anlamak zor. Haritalar'da da, ContainsKey () ve ContainsValue () i┼člevlerinin anla┼č─▒lmas─▒ ├žok kolay.
  3. Hashmap'ta elementi g├╝venle yineleyerek ├ž─▒karabilirsiniz. hashtables'ta m├╝mk├╝n olmad─▒─č─▒ yerde.
  4. HashTable'lar varsay─▒lan olarak senkronize edilmi┼čtir, b├Âylece kolayca birden fazla i┼č par├žac─▒─č─▒ ile kullan─▒labilir. HashMaps varsay─▒lan olarak senkronize edilmedi─či i├žin, sadece tek bir i┼č par├žac─▒─č─▒ ile kullan─▒labilir. Ancak Collections util s─▒n─▒f─▒n─▒n synchronizedMap (Harita m) i┼člevini kullanarak HashMap'i e┼čitlemeye yine de d├Ân├╝┼čt├╝rebilirsiniz.
  5. HashTable bo┼č anahtarlara veya bo┼č de─čerlere izin vermez. HashMap'in bir bo┼č anahtar ve birden fazla bo┼č de─čere izin verdi─či yerde.

13







K├╝├ž├╝k katk─▒m:

  1. Birincisi ve en ├Ânemlisi aras─▒ndaki fark, Hashtable ve HashMap , HashMap g├╝venli Hashtable bir konu oldu─ču s├╝rece , g├╝venli bir konu de─čil.

  2. Aras─▒ndaki ─░kinci ├Ânemli fark Hashtable ve HashMap bu yana, performans HashMap daha iyi daha ger├žekle┼čtirmek senkronize edilmez Hashtable .

  3. ├ť├ž├╝nc├╝ fark Hashtable vs HashMap yani Hashtable eskimi┼č s─▒n─▒ft─▒r ve kullanmakta edilmelidir ConcurrentHashMap yerine Hashtable Java.


12







HashTable , jdk'de art─▒k kullan─▒lmamas─▒ gereken eski bir s─▒n─▒ft─▒r. Kullan─▒mlar─▒n─▒ ConcurrentHashMap ile de─či┼čtirin . E─čer iplik g├╝venlik, kullan─▒m ihtiyac─▒n─▒z yoksa HashMap de─čil ├ů┼Şan ancak daha h─▒zl─▒ ve kullan─▒mlar─▒ daha az bellek.


9







HashMap: java.util paketinde mevcut bir s─▒n─▒ft─▒r ve ├Â─čeyi anahtar ve de─čer bi├žiminde saklamak i├žin kullan─▒l─▒r.

Hashtable: Koleksiyon ├žer├ževesi i├žinde tan─▒nmakta olan eski bir s─▒n─▒ft─▒r.


9







HashMap ve HashTable

  • HashMap ve HashTable hakk─▒nda baz─▒ ├Ânemli noktalar. l├╝tfen detaylar─▒ a┼ča─č─▒da okuyunuz.

1) Hashtable ve Hashmap, java.util.Map aray├╝z├╝n├╝ uygular. 2) Hem Hashmap hem de Hashtable, karma tabanl─▒ koleksiyondur. ve karma ├╝zerinde ├žal─▒┼čmak. bu y├╝zden bunlar HashMap ve HashTable'─▒n benzerli─čidir.

  • HashMap ve HashTable aras─▒ndaki fark nedir?

1) ─░lk fark HashMap i┼č par├žac─▒─č─▒ g├╝venli de─čil. HashTable ThreadSafe ise
2) HashMap i┼č par├žac─▒─č─▒ g├╝venli olmad─▒─č─▒ndan ak─▒ll─▒ca daha iyi performans g├Âsteriyor. Hashtable performans bilge daha iyi de─čil iken i┼č par├žac─▒─č─▒ g├╝venli oldu─čundan. bu y├╝zden birden fazla i┼č par├žac─▒─č─▒ ayn─▒ anda Hashtable'a eri┼čemiyor.


8







  1. Hashtable oysa senkronize HashMap de─čil.
  2. Di─čer bir farkl─▒l─▒k o Yineleyicinin HashMap fail-safe i├žin listeleyicisi varken Hashtable de─čil. E─čer tekrarlarken haritay─▒ de─či┼čtirirseniz, anlars─▒n─▒z.
  3. HashMap ─░├žinde null de─čerlere izin verirken Hashtable , null de─čerlerine izin verir .

8


2013-01-22





Hashtable:

Hashtable , anahtar / de─čer ├žiftinin de─čerlerini tutan bir veri yap─▒s─▒d─▒r. Hem anahtarlar hem de de─čerler i├žin null de─čerine izin vermez. E─čer NullPointerException bo┼č de─čer eklerseniz , bir al─▒rs─▒n─▒z . Senkronize edilir. Bu y├╝zden maliyeti ile geliyor. HashTable'a belirli bir zamanda yaln─▒zca bir i┼č par├žac─▒─č─▒ eri┼čebilir .

├ľrnek :

 import java.util.Map;
import java.util.Hashtable;

public class TestClass {

    public static void main(String args[ ]) {
    Map<Integer,String> states= new Hashtable<Integer,String>();
    states.put(1, "INDIA");
    states.put(2, "USA");

    states.put(3, null);    //will throw NullPointerEcxeption at runtime

    System.out.println(states.get(1));
    System.out.println(states.get(2));
//  System.out.println(states.get(3));

    }
}
 

hashmap:

HashMap Hashtable'a benzer, ancak ayn─▒ zamanda anahtar de─čer ├žiftini de kabul eder. Hem tu┼člar hem de de─čerler i├žin null de─čerine izin verir. Performans─▒ daha iyi HashTable , ├ž├╝nk├╝ ├Âyle unsynchronized .

├ľrnek:

 import java.util.HashMap;
import java.util.Map;

public class TestClass {

    public static void main(String args[ ]) {
    Map<Integer,String> states = new HashMap<Integer,String>();
    states.put(1, "INDIA");
    states.put(2, "USA");

    states.put(3, null);    // Okay
    states.put(null,"UK");

    System.out.println(states.get(1));
    System.out.println(states.get(2));
    System.out.println(states.get(3));

    }
}
 

7







HashMaps size senkronizasyon ├Âzg├╝rl├╝─č├╝ verir ve hata ay─▒klama ├žok daha kolayd─▒r


4


2012-08-09





HashMap taklit ve bu nedenle de kullan─▒lmas─▒ m├╝mk├╝nd├╝r GWT client code , oysa Hashtable de─čildir.


4


2013-07-15





Senkronizasyon veya g├╝venli Konu :

Karma Haritas─▒ senkronize edilmez, bu nedenle g├╝venli de─čildir ve uygun senkronize blok olmadan ├žoklu i┼č par├žac─▒klar─▒ aras─▒nda payla┼č─▒lamaz, oysa Hashtable senkronize edilir ve bu nedenle i┼č par├žac─▒─č─▒ g├╝venlidir.

Bo┼č anahtarlar ve bo┼č de─čerler :

HashMap bir bo┼č tu┼ča ve herhangi bir say─▒da bo┼č de─čere izin verir. Y─▒kanabilir bo┼č tu┼člara veya de─čerlere izin vermez.

De─čerleri yineleme :

HashMap'teki yineleyici, hatas─▒z bir yineleyicidir; Hashtable numaraland─▒r─▒c─▒s─▒ de─čil ise ve e─čer herhangi bir ba┼čka i┼č par├žac─▒─č─▒, Iterator'─▒n kendi remove () y├Ântemi d─▒┼č─▒nda herhangi bir ├Â─če ekleyerek veya kald─▒rarak haritay─▒ yap─▒sal olarak de─či┼čtirirse, ConcurrentModificationException ├Â─česini f─▒rlat─▒r.

S├╝per S─▒n─▒f ve Miras :

HashMap, AbstractMap s─▒n─▒f─▒n─▒n alt s─▒n─▒f─▒d─▒r, Hashtable ise Dictionary s─▒n─▒f─▒n─▒n alt s─▒n─▒f─▒d─▒r.

Performans :

HashMap senkronize edilmedi─činden Hashtable'a k─▒yasla daha h─▒zl─▒.

Bak─▒n─▒z http://modernpathshala.com/Article/1020/difference-between-hashmap-and-hashtable-in-java Java koleksiyonuna ili┼čkin ├Ârnekler ve m├╝lakat sorular─▒ ve s─▒nav i├žin


4



─░lgili yay─▒nlar


HashMap, LinkedHashMap ve TreeMap Aras─▒ndaki Fark

Neden null bir nesnedir ve null ile undefined aras─▒ndaki fark nedir?

<b> ve <strong>, <i> ve <em> aras─▒ndaki fark nedir?

Ne sebep olur ve NoClassDefFoundError ve ClassNotFoundException aras─▒ndaki farklar nelerdir?

Typeof ve instanceof aras─▒ndaki fark nedir ve biri di─čerine ne zaman kullan─▒lmal─▒d─▒r?

Map ve flatMap ve her biri i├žin iyi bir kullan─▒m durumu aras─▒ndaki fark nedir?

Read () ve recv () ile ve G├Ânderen () ve write () Aras─▒ndaki Fark Nedir?

Yineleyici ile yinelenebilir aras─▒ndaki fark nedir ve nas─▒l kullan─▒l─▒r?

$ .Ajax () ve $ .get () ve $ .load () aras─▒ndaki fark

HashSet ve HashMap aras─▒ndaki fark?

Etiketle ilgili di─čer sorular [java]


Ge├žerli dizini ve dosyan─▒n dizinini bulun [duplicate]

AndroidÔÇÖdeki niyetten nas─▒l ekstra veri alabilirim?

Git'teki etiketsiz de─či┼čikliklerden ÔÇťeski mod 100755 yeni mod 100644ÔÇŁ diyen dosyalar─▒ nas─▒l kald─▒rabilirim?

Yaln─▒zca ├Â─če i├žin CSS stillerini s─▒f─▒rla / kald─▒r

NuGet ile paketin eski bir s├╝r├╝m├╝n├╝ nas─▒l y├╝kleyebilirim?

Gradle ├╝zerinde sadece bir test s─▒n─▒f─▒ nas─▒l ├žal─▒┼čt─▒r─▒l─▒r

REST API En iyi y├Ântemler: Parametreleri nereye koymak? [kapal─▒]

Html.ActionLink, bir d├╝─čme de─čil, d├╝─čme veya resim olarak

Android'de g├Âr├╝n├╝m arka plan rengini de─či┼čtirmeyi canland─▒r

Bu sat─▒r i├ži blok div elemanlar─▒ aras─▒nda neden a├ž─▒klanamayan bir bo┼čluk var?