HashMap සහ Hashtable අතර වෙනස්කම්?


3751

ජාවා හි a HashMapසහ a අතර ඇති වෙනස්කම් Hashtableමොනවාද?

නූල් නොවන යෙදුම් සඳහා වඩා කාර්යක්ෂම වන්නේ කුමක්ද?


17
ජාවා 1.7 හි හැෂ් ටේබල් යල්පැන ඇති අතර සමගාමී
සිතියම්

@MissFiona නැහැ, ConcurrentMapවන නොවේ අවශ්ය මෙතන, ප්රශ්නය අර්ථය නිගමනයට / සමගාමී ප්රශ්නයක් නැහැ "-පොටවල් නොවන අයදුම්පත්" පවසන පරිදි.
බැසිල් බෝර්ක්

Answers:


3775

ජාවා HashMapසහ අතර වෙනස්කම් කිහිපයක් තිබේ Hashtable:

  1. Hashtableඇත සමමුහුර්ත බැවින්ද, HashMapනොවේ. මෙම නිසා, HashMap-පොටවල් නොවන යෙදුම් සඳහා වඩා හොඳ, unsynchronized වස්තූන් සාමාන්යයෙන් සමමුහුර්ත අය වඩා හොඳ ඉටු විය.

  2. Hashtablenullයතුරු හෝ අගයන්ට ඉඩ නොදේ . HashMapඑක් nullයතුරක් සහ ඕනෑම nullඅගයන් ගණනකට ඉඩ දෙයි .

  3. හැෂ්මැප් හි උප පංති වලින් එකක් වන්නේ LinkedHashMap, එබැවින් ඔබට පුරෝකථනය කළ හැකි පුනරාවර්තන අනුපිළිවෙලක් අවශ්‍ය නම් (එය පෙරනිමියෙන් ඇතුළත් කිරීමේ අනුපිළිවෙලයි), ඔබට පහසුවෙන් HashMapa සඳහා මාරු විය හැකිය LinkedHashMap. ඔබ භාවිතා කරන්නේ නම් මෙය එතරම් පහසු නොවනු ඇත Hashtable.

සමමුහුර්තකරණය ඔබට ගැටළුවක් නොවන බැවින්, මම නිර්දේශ කරමි HashMap. සමමුහුර්තකරණය ගැටලුවක් බවට පත්වුවහොත්, ඔබටද බැලිය හැකිය ConcurrentHashMap.


84
ඔබට හැෂ්මැප් නූල් ආරක්ෂිත කිරීමට අවශ්‍ය නම් භාවිතා කරන්න Collections.synchronizedMap().
Rok Strniša

275
නූල්-ආරක්ෂාව පිළිබඳ බොළඳ ප්‍රවේශය Hashtable(“සෑම ක්‍රමයක්ම සමමුහුර්ත කිරීම මගින් ඕනෑම සහසම්බන්ධතා ගැටලු ගැන සැලකිලිමත් විය යුතුය!”) නූල් යෙදුම් සඳහා එය වඩාත් නරක අතට හැරෙන බව ද මම අදහස් කරමි . ඔබ බාහිරව සමමුහුර්ත කිරීම HashMap(සහ ප්‍රතිවිපාක ගැන සිතීම) හෝ ConcurrentMapක්‍රියාත්මක කිරීමක් භාවිතා කිරීම වඩා හොඳය (සහ සමගාමී මුදල් සඳහා එහි දීර් API API ගසාකෑම). නිගමනය: භාවිතා කිරීමට ඇති එකම හේතුව Hashtableවන්නේ උරුම API (ca. 1996 සිට) අවශ්‍ය වූ විටය.
එරික්සන්

8
හැෂ්මැප් ක්‍රමලේඛකයාට නූල් සේෆ් කේතය සත්‍ය වශයෙන්ම භාවිතා කරන විට එය ලිවීමට නම්යශීලී බවක් ලබා දෙයි. මට සමගාමී හැෂ්මැප් හෝ හැෂ් ටේබල් වැනි නූල් ආරක්ෂිත එකතුවක් අවශ්‍ය වූයේ කලාතුරකිනි. මට අවශ්‍ය වී ඇත්තේ සමමුහුර්ත කොටසේ ඇති යම් යම් කාර්යයන් හෝ ප්‍රකාශයන් නූල් ආරක්ෂිත වීමයි.
ගෞරවා අගර්වාල්

2
Hashtable යල්පැන ඇති අතර අපි නූල් නොවන ආරක්ෂිත පරිසරයක් සඳහා HashMap භාවිතා කරමු. ඔබට නූල් ආරක්ෂාව අවශ්‍ය නම් ඔබට Collections.synchronizedMap () භාවිතා කළ හැකිය, නැතහොත් හැන්ස්ටබල් කළ හැකි වඩා කාර්යක්ෂම වන සමගාමී හැෂ්මැප් භාවිතා කළ හැකිය.
මනීෂ් කුමාර්

1
එය යල්පැන ඇති නමුත් අතහැර දමා නැති අතර මම කල්පනා කරන්නේ මෙය ඇයි කියායි. මම හිතන්නේ මෙම පංතිය ඉවත් කිරීම (සහ එකම හේතු නිසා දෛශිකය) දැනට පවතින කේතය ඕනෑවට වඩා කැඩී යනු ඇති අතර ep අවලංගු කිරීම සමඟ විවරණය කිරීමෙන් සංකේතය ඉවත් කිරීමේ අභිප්‍රාය අදහස් වන අතර පෙනෙන ආකාරයට එහි නොමැත.
ජිලස් වැන් ගුර්ප්

682

සටහන, බොහෝ පිළිතුරු වල හැෂ්ටේබල් සමමුහුර්ත වී ඇති බව සඳහන් වේ. ප්රායෝගිකව මෙය ඔබ මිලදී ගන්නේ ඉතා අල්ප වශයෙනි. සමමුහුර්තකරණය ප්‍රවේශක / විකෘති ක්‍රම මඟින් සිතියමෙන් සමගාමීව නූල් දෙකක් එකතු කිරීම හෝ ඉවත් කිරීම නවත්වනු ඇත, නමුත් සැබෑ ලෝකයේ ඔබට බොහෝ විට අමතර සමමුහුර්තකරණය අවශ්‍ය වේ.

ඉතා සුලභ මෝඩකමක් නම් "පරීක්ෂා කර පසුව තබන්න" - එනම් ඇතුලත් කිරීමක් සොයන්න Map, එය දැනටමත් නොපවතී නම් එය එක් කරන්න. මෙය ඔබ භාවිතා කරන Hashtableහෝ වේවා පරමාණුක ක්‍රියාවක් නොවේHashMap .

සමානව සමමුහුර්තකරණය HashMapලබා ගත හැක්කේ:

Collections.synchronizedMap(myMap);

නමුත් මෙම තර්කනය නිවැරදිව ක්‍රියාත්මක කිරීම සඳහා ඔබට පෝරමයේ අතිරේක සමමුහුර්තකරණය අවශ්‍ය වේ:

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

පවා අධික එල්ලාවල මහතා Hashtableගේ සටහන් (හෝ HashMapවිසින් ලබා ගන්නා ලද Collections.synchronizedMapඔබ ද ආරක්ෂා නම්) ආරක්ෂාකාරී නූල් නැතMap අමතර සමමුහුර්ත හරහා වෙනස් වෙමින් සිට.

ConcurrentMapඅතුරුමුහුණත ක්‍රියාත්මක කිරීම (නිදසුනක් ලෙස ConcurrentHashMap) නූල් ආරක්ෂිත චෙක්-පසුව-ක්‍රියාකාරී අර්ථකථන ඇතුළත් කිරීමෙන් මේවායින් සමහරක් විසඳයි :

ConcurrentMap.putIfAbsent(key, value);

53
HashMap වෙනස් කර ඇත්නම්, එය යොමු කරන iterator වලංගු නොවන බව සලකන්න.
ක්‍රිස් කේ

3
නූල් ආරක්ෂිතව සමමුහුර්ත (myMap) {...} සහ සමගාමී හැෂ්මැප් අතර වෙනසක් තිබේද?
ටෙලිබොග්

3
ඉතා ඇත්ත, මම මෙහි එය පැහැදිලි කිරීමට උත්සාහ කළෙමි .. lovehasija.com/2012/08/16/…
Love Hasija

H භූෂාන්: එය උපරිම උත්සාහයක් දරනු ඇත, මෙය සහතික කළ හැසිරීමක් නොවේ: docs.oracle.com/javase/7/docs/api/java/util/HashMap.html
මැට් ස්ටීවන්සන්

වසර ගණනාවක් තිස්සේ ජේවීඑම් සංවර්ධන කාර්ය මණ්ඩලයක් මධ්‍යයේ සිට ඇති මට හැෂ්ටේබල්ගේ අභ්‍යන්තර සමමුහුර්තකරණය අවම වශයෙන් ප්‍රයෝජනවත් බව ඔහු සඳහන් කළ හැකිය. හේතුව සමගාමී වෙනස් කිරීමක් වූ විට, හැෂ්මැප් හි අසාර්ථකත්වයන් පිළිබඳ පැමිණිලි කිහිපයක් අපට ලැබුණි (එබැවින් "පැහැදිලිවම" ජේඩීකේ / ජේවීඑම් දෝෂයකි).
හොට් ලික්ස්

363

Hashtableපැරණි කේතය ලෙස සැලකේ. ඒ ගැන කිසිවක් Hashtableකළ නොහැක, HashMapහෝ ව්‍යුත්පන්නයන් භාවිතා කළ නොහැක HashMap, එබැවින් නව කේතය සඳහා, ආපසු යෑමට කිසිදු සාධාරණත්වයක් මා දකින්නේ නැත Hashtable.


101
Hashtable javadoc වෙතින් (අවධාරණය එකතු කරන ලදි): "ජාවා 2 වේදිකාව v1.2 අනුව, සිතියම් අතුරුමුහුණත ක්‍රියාත්මක කිරීම සඳහා මෙම පන්තිය නැවත සකස් කරන ලද අතර එය ජාවා එකතු කිරීමේ රාමුවේ සාමාජිකයෙකු බවට පත් විය ." කෙසේ වෙතත්, එය උරුම කේතය බව ඔබ හරි. Collections.synchronizedMap (HashMap) සමඟ සමමුහුර්ත කිරීමේ සියලු ප්‍රතිලාභ වඩාත් කාර්යක්ෂමව ලබා ගත හැකිය. (දෛශිකය Collections.synchronizedList (ArrayList) හි පැරණි අනුවාදයක් වීමට සමානය.)
Kip


6
මෙම පිළිතුර මකා දැමිය යුතුය. එහි වැරදි තොරතුරු අඩංගු වන අතර ඉහළ නැංවීම් රාශියක් ඇත.
anon58192932

@ anon58192932 එය නිවැරදි කිරීම සඳහා ප්‍රශ්නය සංස්කරණය කළ හැකිද?
GC_

1
අප විසින් පෝස්ටරයේ අවධානය යොමු කළ යුතුය @ aberrant80 හෝ පරිපාලක ධජය සලකුණු කිරීමෙන්. සලකුණු කිරීම උදව් විය හැකිය - දැන් එය උත්සාහ කරනු ඇත.
anon58192932

189

එකතු කිරීමේ පංතිවල නිවැරදි භාවිතය අපේක්ෂකයා තේරුම් ගෙන තිබේද සහ ලබා ගත හැකි විකල්ප විසඳුම් පිළිබඳව දැනුවත් දැයි පරීක්ෂා කිරීම සඳහා මෙම ප්‍රශ්නය බොහෝ විට සම්මුඛ පරීක්ෂණයේදී අසනු ලැබේ.

  1. මෙම HashMapපන්ති සඳහා දළ වශයෙන් සමාන වේ Hashtableඑය නොවන සමමුහුර්ත හා nulls අවසර ඇති බව හැර,. ( HashMapශුන්‍ය අගයන් යතුර සහ අගය ලෙස Hashtableඉඩ දෙන අතර nulls වලට ඉඩ නොදේ ).
  2. HashMap කාලයාගේ ඇවෑමෙන් සිතියමේ අනුපිළිවෙල නියතව පවතින බවට සහතික නොවේ.
  3. HashMapසමමුහුර්ත කර නොමැති අතර Hashtableසමමුහුර්ත කර ඇත.
  4. තමන්ගේම ක්‍රමය හැර වෙනත් මූලද්‍රව්‍යයක් එකතු කිරීමෙන් හෝ ඉවත් කිරීමෙන් වෙනත් නූල් සිතියමක් ව්‍යුහාත්මකව වෙනස් කරන්නේ නම්, ඒ HashMapසඳහා ගණන් ගන්නා යන්ත්‍රය අසමත් වන අතර Hashtableවිසි කරන්න . නමුත් මෙය සහතික කළ හැසිරීමක් නොවන අතර එය ජේවීඑම් විසින් උපරිම උත්සාහයෙන් කරනු ඇත.ConcurrentModificationExceptionIteratorremove()

සමහර වැදගත් කොන්දේසි පිළිබඳ සටහන:

  1. සමමුහුර්තකරණය යනු එක් වරකදී හැෂ් වගුවක් වෙනස් කළ හැක්කේ එක් නූල් එකකට පමණි. මූලික වශයෙන්, එයින් අදහස් වන්නේ යාවත්කාලීනයක් සිදු කිරීමට පෙර ඕනෑම නූලකට Hashtableවස්තුවෙහි අගුලක් ලබා ගත යුතු අතර අනෙක් අය අගුල මුදා හරින තෙක් බලා සිටින බවයි.
  2. අසාර්ථක-ආරක්‍ෂාව අදාළ වන්නේ සන්දර්භය තුළ ය. එකතු කිරීමේ වස්තුවක් මත අනුකාරකයක් නිර්මාණය කර ඇත්නම් සහ තවත් නූල් එකතු කිරීමේ වස්තුව “ව්‍යුහාත්මකව” වෙනස් කිරීමට උත්සාහ කරන්නේ නම්, සමගාමී වෙනස් කිරීමේ ව්‍යතිරේකයක් විසි කරනු ලැබේ. setඑකතු කිරීම "ව්‍යුහාත්මකව" වෙනස් නොකරන බැවින් වෙනත් නූල් සඳහා ක්‍රමයට ආයාචනා කළ හැකිය. කෙසේ වෙතත්, ඇමතීමට පෙර set, එකතුව ව්‍යුහාත්මකව වෙනස් කර ඇත, IllegalArgumentExceptionවිසි කරනු ලැබේ.
  3. ව්‍යුහාත්මකව වෙනස් කිරීම යනු සිතියමේ ව්‍යුහය effectively ලදායී ලෙස වෙනස් කළ හැකි මූලද්‍රව්‍යය මකා දැමීම හෝ ඇතුළත් කිරීම ය.

HashMap මගින් සමමුහුර්ත කළ හැකිය

Map m = Collections.synchronizeMap(hashMap);

ගණන් බැලීමේ වස්තු හරහා පුනරාවර්තනය සඳහා support ජු සහාය වෙනුවට සිතියම එකතු කිරීමේ දර්ශන සපයයි. මෙම කොටසේ පසුව සාකච්ඡා කළ පරිදි එකතු කිරීමේ අදහස් අතුරු මුහුණතේ ප්‍රකාශන හැකියාව බෙහෙවින් වැඩි කරයි. යතුරු, අගයන් හෝ යතුරු-වටිනාකම් යුගල හරහා නැවත සැකසීමට සිතියම ඔබට ඉඩ දෙයි; Hashtableතෙවන විකල්පය සපයන්නේ නැත. පුනරාවර්තනය මධ්‍යයේ ඇතුළත් කිරීම් ඉවත් කිරීමට සිතියම ආරක්ෂිත ක්‍රමයක් සපයයි; Hashtableනැත. අවසාන වශයෙන්, සිතියමෙහි සුළු අඩුපාඩුවක් නිරාකරණය කරයිHashtable අතුරු මුහුණතේ . ලබා දී ඇති අගයක් තිබේ Hashtableනම් එය සත්‍ය බවට පත්වේ Hashtable. එහි නම අනුව, Hashtableලබා දී ඇති යතුරක් තිබේ නම් මෙම ක්‍රමය සත්‍ය වනු ඇතැයි ඔබ අපේක්ෂා කරනු ඇත , මන්ද යතුර a සඳහා මූලික ප්‍රවේශ යාන්ත්‍රණය වන Hashtableබැවිනි. සිතියම් අතුරුමුහුණත ක්‍රමවේදය නැවත නම් කිරීමෙන් මෙම ව්‍යාකූල ප්‍රභවය ඉවත් කරයි containsValue. එසේම, මෙය අතුරු මුහුණතේ අනුකූලතාව වැඩි දියුණු කරයි - containsValueසමාන්තර containsKey.

සිතියම් අතුරුමුහුණත


19
මෙම පිළිතුරෙහි අවම වශයෙන් සැලකිය යුතු කරුණු කාරණා 2 ක් අඩංගු වේ. එය නිසැකවම මෙම ඉහළ නැංවීමට සුදුසු නොවේ.
ස්ටීවන් සී

58
1) හැෂ්මැප් හි අනුකාරක අසාර්ථක-ආරක්ෂිත නොවේ. ඒවා අසාර්ථකයි. එම පද දෙක අතර අර්ථයේ විශාල වෙනසක් ඇත. 2) setHashMap. 3) පෙර වෙනසක් සිදුවී ඇත්නම් put(...)මෙහෙයුම විසි නොවේ IllegalArgumentException. 4) ඔබ සිතියම් ගත කිරීමක් වෙනස් කළහොත් අසාර්ථක-වේගවත් හැසිරීම HashMap සිදුවේ. 5) අසමත් වේගයෙන් හැසිරීම වේ සහතික. (සහතික නොවන දෙය HashTableනම් ඔබ සමගාමී වෙනස් කිරීමක් කළහොත් හැසිරීමයි. සත්‍ය හැසිරීම ... අනාවැකි කිව නොහැක.)
ස්ටීවන් සී

25
6) Hashtableසිතියම් මූලද්‍රව්‍යයන්ගේ අනුපිළිවෙල කාලයත් සමඟ ස්ථාවර වන බවට සහතික නොවේ. (ඔබ සමහර විට ව්‍යාකූල Hashtableවී ඇත LinkedHashMap.)
ස්ටීවන් සී

4
එකතුකිරීම්වල “සමමුහුර්ත අනුවාදයන්” ලබා ගැනීම කෙසේ හෝ අදහස් කරන්නේ ඔබ සංයෝග මෙහෙයුම් බාහිරව සමමුහුර්ත කළ යුතු නැති බව වැරදි අදහසක් මේ දිනවල සිසුන්ට ලැබීම ගැන වෙන කවුරුහරි කනස්සල්ලට පත්ව සිටීද? මේ සඳහා මගේ ප්‍රියතම උදාහරණය thing.set(thing.get() + 1);බොහෝ විට නවක වදය පුදුමයට පත් නොවී සම්පූර්ණයෙන්ම අනාරක්‍ෂිතයි, විශේෂයෙන් get()සහ set()සමමුහුර්ත ක්‍රම නම්. ඔවුන්ගෙන් බොහෝ දෙනෙක් මැජික් අපේක්ෂා කරති.

හැෂ්මැප් හි අනුභව කරන්නන් අසාර්ථකයි
අබ්දුල්

130

HashMap: Mapඅරාව සුචිගත කිරීම සඳහා හැෂ් කේත භාවිතා කරන අතුරු මුහුණත ක්‍රියාත්මක කිරීම . Hashtable: හායි, 1998 කැඳවීය. ඔවුන්ට ඔවුන්ගේ එකතු කිරීමේ API නැවත අවශ්‍ය වේ.

ඇත්තෙන්ම, ඔබ Hashtableසම්පූර්ණයෙන්ම stay ත්ව සිටීම හොඳය . තනි-නූල් යෙදුම් සඳහා, ඔබට සමමුහුර්ත කිරීමේ අමතර පොදු අවශ්‍ය නොවේ. ඉහළ සමගාමී යෙදුම් සඳහා, ව්‍යාකූල සමමුහුර්තකරණය සාගින්න, අවහිරතා හෝ අනවශ්‍ය කසළ එකතු කිරීමේ විරාම වලට තුඩු දිය හැකිය. ටිම් හොව්ලන්ඩ් පෙන්වා දුන් පරිදි, ඔබට ConcurrentHashMapඒ වෙනුවට භාවිතා කළ හැකිය .


මෙය සැබවින්ම අර්ථවත් කරයි. සමගාමී හැෂ්මැප්ස් ඔබට සමමුහුර්ත කිරීමේ නිදහස ලබා දෙන අතර නිදොස් කිරීම වඩාත් පහසු වේ.
prap19

1
මෙය ජාවා හෝ විශේෂිත හැෂ් සිතියම් ක්‍රියාත්මක කිරීම සඳහා විශේෂිතද?

125

HashTableජාවා එකතු කිරීමේ රාමුව (JCF) හඳුන්වාදීමට පෙර එය පැරණි පන්තියක් වූ බව මතක තබා ගන්න Map. ඒ නිසා විය Vectorහා Stack.

එබැවින්, අනෙක් අය පෙන්වා දුන් පරිදි ජේසීඑෆ් හි සෑම විටම වඩා හොඳ විකල්පයක් ඇති බැවින් සෑම විටම ඔවුන්ගෙන් නව කේතයකින් stay ත්ව සිටින්න .

මෙන්න ඔබට ප්‍රයෝජනවත් වන ජාවා එකතු කිරීමේ වංචා පත්‍රය . අළු බ්ලොක් වල හැෂ් ටේබල්, දෛශික සහ ස්ටැක් යන පැරණි පන්තිය අඩංගු බව සලකන්න.

රූප විස්තරය මෙහි ඇතුළත් කරන්න


72

දැනටමත් පළ කර ඇති හොඳ පිළිතුරු බොහොමයක් තිබේ. මම නව කරුණු කිහිපයක් එකතු කර සාරාංශ කරමි.

HashMapහා Hashtableදෙකම ගබඩා කිරීම සඳහා භාවිතා වේ යතුර සහ අගය ස්වරූපයෙන් දත්ත . දෙදෙනාම අද්විතීය යතුරු ගබඩා කිරීම සඳහා හැෂිං තාක්ෂණය භාවිතා කරයි. නමුත් පහත දක්වා ඇති HashMap සහ Hashtable පන්ති අතර බොහෝ වෙනස්කම් තිබේ.

හැෂ්මැප්

  1. HashMapසමමුහුර්ත කර නොමැත. එය නූල් ආරක්ෂිත නොවන අතර නිසි සමමුහුර්ත කේතයකින් තොරව බොහෝ නූල් අතර බෙදා ගත නොහැක.
  2. HashMap එක් ශුන්‍ය යතුරකට සහ බහු ශුන්‍ය අගයන්ට ඉඩ දෙයි.
  3. HashMap යනු JDK 1.2 හි හඳුන්වා දුන් නව පන්තියකි.
  4. HashMap වේගවත්.
  5. HashMapමෙම කේතය ඇමතීමෙන් අපට සමමුහුර්ත කළ හැකිය
    Map m = Collections.synchronizedMap(HashMap);
  6. HashMap ඉටරේටර් විසින් ගමන් කරයි.
  7. අනුකාරකය HashMapඅසාර්ථකයි.
  8. HashMap සාරාංශ සිතියම් පන්තිය උරුම කර ගනී.

කඩිනම්

  1. Hashtableසමමුහුර්ත කර ඇත. එය නූල්-ආරක්ෂිත වන අතර බොහෝ නූල් සමඟ බෙදා ගත හැකිය.
  2. Hashtable කිසිදු ශුන්‍ය යතුරකට හෝ අගයකට ඉඩ නොදේ.
  3. Hashtable උරුම පන්තියකි.
  4. Hashtable මන්දගාමී වේ.
  5. Hashtable අභ්‍යන්තරව සමමුහුර්ත කර ඇති අතර සමමුහුර්ත කළ නොහැක.
  6. Hashtable ගණනය කරනු ලබන්නේ ගණන් ගැනීමේ යන්ත්‍රය සහ අනුකාරකය විසිනි.
  7. ගණන් ගැනීමේ යන්ත්‍රය Hashtableවේගවත් නොවේ.
  8. Hashtable ශබ්ද කෝෂ පන්තියට උරුම වේ.

වැඩිදුර කියවීම ජාවා හි හැෂ්මැප් සහ හැෂ්ටේබල් අතර වෙනස කුමක්ද?

රූප විස්තරය මෙහි ඇතුළත් කරන්න


මෙම පිළිතුරෙහි බොහෝ දේ ආවරණය කර ඇත (අනුපිටපත) - stackoverflow.com/a/39785829/432903 .
praagupd

H " හැෂ්ටබල් යනු උරුම පන්තියක් " යැයි ඔබ කියන්නේ ඇයි ? ඒ සඳහා උපකාරක ලියකියවිලි කොහේද?
ඊගෝර්ගනාපොල්ස්කි

2
GIgorGanapolsky ඔබට මෙය කියවිය හැකිය - stackoverflow.com/questions/21086307/…
roottraveller

HashMap නඩත්තු කිරීම TreeMap වලට වඩා මිල අධිකය. HashMap අනවශ්‍ය අමතර බාල්දි නිර්මාණය කරන බැවිනි.
අබ්දුල්

64

Izb පැවසූ දෙයට අමතරව, HashMapශුන්‍ය අගයන් සඳහා ඉඩ ලබා දේ Hashtable.

ජාවාඩොක්ස් තත්වය ලෙස යල්පැන ඇති අතර එය අතුරු මුහුණත මගින් ප්‍රතිස්ථාපනය කර ඇති පන්තිය Hashtableදිගු කරන බව සලකන්න .DictionaryMap


3
නමුත් එමඟින් හැෂ්ටේබල් යල් පැන ගිය එකක් නොවේද?
පැසීරියර්

Ac ජාවා 1.7 සිට පැසීරියර් හැෂ් ටේබල් යල්පැන ඇත.
මජිඩ් අලි ඛාන්


49

Hashtableහා සමාන වන HashMapඅතර සමාන අතුරු මුහුණතක් ඇත. ක්‍රම සමමුහුර්ත HashMapකර ඇති බැවින්, ඔබට පැරණි යෙදුම් සඳහා සහය අවශ්‍ය නම් හෝ ඔබට සමමුහුර්තකරණය අවශ්‍ය නම් මිස භාවිතා කිරීම රෙකමදාරු කරනු Hashtablesලැබේ. එබැවින් ඔබ බහු-නූල් නොවන HashMapsබැවින් ඔබේ හොඳම ඔට්ටුව වේ.


36

හැෂ් ටේබල් සහ හැෂ්මැප් අතර ඇති තවත් ප්‍රධාන වෙනසක් නම්, හැෂ්මෙප් හි ඉටරේටරය අසාර්ථක-වේගවත් වන අතර, හැෂ් ටේබල් සඳහා ගණන් ගන්නා යන්ත්‍රය නොපවතින අතර, වෙනත් ඕනෑම ත්‍රෙඩ් එකක් සිතියම ව්‍යුහාත්මකව වෙනස් කරන්නේ නම්, ඉටරේටර්ගේම ඉවත් කිරීමේ () ක්‍රමය හැර. නමුත් මෙය සහතික කළ හැසිරීමක් නොවන අතර එය ජේවීඑම් විසින් උපරිම උත්සාහයෙන් කරනු ඇත.

මගේ මූලාශ්‍රය: http://javarevisited.blogspot.com/2010/10/difference-between-hashmap-and.html


36

දැනටමත් මෙහි සඳහන් කර ඇති අනෙකුත් සියලුම වැදගත් කරුණු වලට අමතරව, එකතු කිරීමේ API (උදා: සිතියම් අතුරුමුහුණත) ජාවා පිරිවිතරයට “නවතම සහ විශාලතම” එකතු කිරීම් වලට අනුකූල වන පරිදි සෑම විටම වෙනස් කරනු ලැබේ.

උදාහරණයක් ලෙස, ජාවා 5 සිතියම් පුනරාවර්තනය සසඳා බලන්න:

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

පැරණි හැෂ්ටබල් ප්‍රවේශයට එරෙහිව:

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

ජාවා 1.8 හි හොඳ පැරණි ස්ක්‍රිප්ටින් භාෂාවලින් මෙන් හැෂ්මැප්ස් තැනීමට සහ ප්‍රවේශ වීමට අපට පොරොන්දු වී ඇත:

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

යාවත්කාලීන කිරීම: නැත, ඔවුන් 1.8 ට ගොඩබසින්නේ නැත ... :(

ව්‍යාපෘති කාසියේ එකතු කිරීමේ වැඩි දියුණු කිරීම් JDK8 හි තිබේද?


34

Hashtableසමමුහුර්ත කර ඇත, නමුත් HashMapඑසේ නොවේ. එය වඩා Hashtableමන්දගාමී වේ Hashmap.

නූල් නොවන යෙදුම් සඳහා, HashMapඒවා ක්‍රියාකාරීත්වය අනුව වෙනත් ආකාරයකින් සමාන බැවින් භාවිතා කරන්න .


30
  • HashTable සමමුහුර්ත කර ඇත, ඔබ එය තනි ත්‍රෙඩ් එකක භාවිතා කරන්නේ නම් ඔබට HashMap භාවිතා කළ හැකිය , එය සමමුහුර්ත නොකළ අනුවාදයකි. සමමුහුර්ත නොකළ වස්තූන් බොහෝ විට තව ටිකක් ක්‍රියාකාරී වේ. මාර්ගය වන විට, බහු නූල් එකවරම හැෂ්මැප් වෙත ප්‍රවේශ වන්නේ නම් සහ අවම වශයෙන් එක් නූල් එකක් සිතියම ව්‍යුහාත්මකව වෙනස් කරයි නම්, එය බාහිරව සමමුහුර්ත කළ යුතුය. සමමුහුර්ත කළ සිතියමකින් ඔබට සමමුහුර්ත නොකළ සිතියමක් ඔතා ගත හැකිය:

    Map m = Collections.synchronizedMap(new HashMap(...));
  • HashTable හි අඩංගු විය හැක්කේ ශුන්‍ය නොවන වස්තුවක් යතුරක් ලෙස හෝ අගයක් ලෙස පමණි. HashMap හි එක් ශුන්‍ය යතුරක් සහ ශුන්‍ය අගයක් අඩංගු විය හැකිය.

  • සිතියම මඟින් ආපසු ලබා දෙන අනුකාරක අසාර්ථක වේ, සිතියම ව්‍යුහාත්මකව නවීකරණය කළ පසු ඕනෑම වේලාවක, එය ක්‍රියාකරුගේම ඉවත් කිරීමේ ක්‍රමවේදය හැරෙන්නට වෙනත් ආකාරයකින්, අනුකාරකය විසි කරයි ConcurrentModificationException. මේ අනුව, සමගාමී වෙනස් කිරීම් හමුවේ, අනාගතයේ දී නිශ්චිත කාලයකදී අත්තනෝමතික, අධිෂ් non ානශීලී නොවන හැසිරීම් අවදානමට ලක් කරනවාට වඩා, ක්‍රියාකරු ඉක්මනින් හා පිරිසිදු ලෙස අසමත් වේ. ඇති ෙහයින්ද මෙම Enumerations Hashtable ගේ යතුරු සහ බලවේග විසින් ආපසු ක්රම අසමත් වේගයෙන් නොවේ.

  • හැෂ් ටේබල් සහ හැෂ්මැප් ජාවා එකතු කිරීමේ රාමුවේ සාමාජිකයෝ වෙති (ජාවා 2 වේදිකාව v1.2 සිට, සිතියම් අතුරුමුහුණත ක්‍රියාත්මක කිරීම සඳහා හැෂ් ටේබල් නැවත සකස් කරන ලදි).

  • හැෂ් ටේබල් උරුම කේතය ලෙස සලකනු ලබන අතර, නූල්-ආරක්ෂිත ඉහළ-සමගාමී ක්‍රියාත්මක කිරීමක් අවශ්‍ය නම්, හැෂ්ටේබල් වෙනුවට සමගාමී හැෂ්මැප් භාවිතා කිරීමට ප්‍රලේඛනය උපදෙස් දෙයි .

  • මූලද්‍රව්‍ය ආපසු ලබා දෙන අනුපිළිවෙල හැෂ්මැප් සහතික නොකරයි. හැෂ් ටේබල් සඳහා මම සිතන්නේ එය එක හා සමාන නමුත් මට සම්පූර්ණයෙන්ම විශ්වාස නැත, එය පැහැදිලිව සඳහන් කරන සම්පත් සොයාගත නොහැක.


30

HashMapහා Hashtableමෙන්ම සැලකිය යුතු Algorithmic වෙනස්කම් තිබේ. මීට පෙර කිසිවෙකු මෙය සඳහන් කර නැති නිසා මම එය ගෙන එන්නේ එබැවිනි. HashMapප්‍රමාණ දෙකක බලයක් සහිත හැෂ් වගුවක් සාදනු ඇත, ඕනෑම බාල්දියක ඔබට මූලද්‍රව්‍ය අටක් (isions ට්ටන) ඇති බැවින් එය ගතිකව වැඩි කරන අතර සාමාන්‍ය මූලද්‍රව්‍ය වර්ග සඳහා මූලද්‍රව්‍ය හොඳින් ඇවිස්සෙනු ඇත. කෙසේ වෙතත්Hashtable ක්‍රියාත්මක කිරීම ඔබ කරන්නේ කුමක්දැයි ඔබ දන්නේ නම් හැෂිං සඳහා වඩා හොඳ සහ සියුම් පාලනයක් සපයයි, එනම් ඔබට වගු ප්‍රමාණය නිවැරදි කළ හැකිය. උදා: ඔබේ අගයන් ඩොමේන් ප්‍රමාණයට ආසන්නතම ප්‍රමුඛ අංකය භාවිතා කරමින් මෙය හැෂ්මැප් වලට වඩා හොඳ ක්‍රියාකාරීත්වයක් ලබා දෙනු ඇත. සමහර අවස්ථා සඳහා.

මෙම ප්‍රශ්නයේ දී පුළුල් ලෙස සාකච්ඡා කර ඇති පැහැදිලි වෙනස්කම් වලින් වෙන්ව, හැෂ් ටේබල් “මැනුවල් ඩ්‍රයිව්” මෝටර් රථයක් ලෙස මම දකිමි. එහිදී ඔබට හැෂිං සහ හැෂ්මැප් පාලනය කළ හැකිය.


27

මෙහි ඇති තොරතුරු මත පදනම්ව , මම හැෂ්මැප් සමඟ යාමට නිර්දේශ කරමි. මම හිතන්නේ ලොකුම වාසිය නම්, ඔබ එය නැවත ක්‍රියාත්මක කරන අතරතුර ජාවා එය වෙනස් කිරීමෙන් වලක්වනු ඇත, ඔබ එය අනුකාරකය හරහා නොකරන්නේ නම් පමණි.


5
එය සැබවින්ම එය වළක්වන්නේ නැත, එය එය හඳුනාගෙන දෝෂයක් විසි කරයි.
බාර්ට් වෑන් හියුකෙලොම්

1
මට වැරදියි, යටින් පවතින එකතුව වෙනස් කිරීමට පෙර එය ConncurrentModificationException එකක් දමනු ඇතැයි මට හොඳටම විශ්වාසයි.
pkaeding

එය සමගාමී වෙනස් කිරීම් හඳුනා ගැනීමට සහ ව්‍යතිරේකයක් විසි කිරීමට උත්සාහ කරනු ඇත . නමුත් ඔබ නූල් වලින් කිසිවක් කරන්නේ නම්, එයට කිසිදු පොරොන්දුවක් දිය නොහැක. බිඳවැටීම ඇතුළුව ඕනෑම දෙයක් සිදුවිය හැකිය .
cHao

24

A Collection- සමහර විට බහාලුමක් ලෙස හැඳින්වේ - හුදෙක් තනි ඒකකයකට බහු මූලද්‍රව්‍ය කාණ්ඩ කරන වස්තුවකි. Collectionසමස්ථ දත්ත ගබඩා කිරීමට, ලබා ගැනීමට, හැසිරවීමට සහ සන්නිවේදනය කිරීමට s භාවිතා කරයි. එකතු කිරීමේ රාමුවක් ඩබ්ලිව් යනු එකතුව නියෝජනය කිරීම සහ හැසිරවීම සඳහා වූ ඒකාබද්ධ ගෘහ නිර්මාණ ශිල්පයකි.

මෙම HashMap JDK1.2සහ Hashtable JDK1.0, දෙකම නියෝජනය කරන බව වස්තූන් පිරිසක් නියෝජනය කිරීම සඳහා භාවිතා වේ <Key, Value>යුගල. සෑම <Key, Value>යුගලයක්ම Entryවස්තුව ලෙස හැඳින්වේ . ඇතුළත් කිරීම් එකතු කිරීම HashMapසහ Hashtable. එකතුවක යතුරු අද්විතීය හෝ සුවිශේෂී විය යුතුය. [විශේෂිත යතුරක් සිතියම්ගත කළ අගය ලබා ගැනීමට ඒවා භාවිතා කරන බැවින්. එකතුවක අගයන් අනුපිටපත් කළ හැකිය.]


« Superclass, උරුමය හා එකතුව රාමුව සාමාජික

හැෂ්ටබල් යනු JDK1.0ශබ්දකෝෂ පන්තියේ උප පංතියක් වන හඳුන්වා දුන් උරුම පන්තියකි. එකතු කිරීමේ රාමුවේ සාමාජිකයෙකු JDK1.2කිරීම සඳහා සිතියම් අතුරුමුහුණත ක්‍රියාත්මක කිරීම සඳහා හැෂ්ටේබල් වෙතින් නැවත සැලසුම් කර ඇත. හැෂ්මැප් යනු ජාවා එකතු කිරීමේ රාමුවේ සාමාජිකයෙකි JDK1.2. හැෂ්මැප් යනු වියුක්ත සිතියම් පන්තියේ උප පංතියයි.

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 { ... }

Capacity ආරම්භක ධාරිතාව සහ පැටවීමේ සාධකය

ධාරිතාව යනු හැෂ් වගුවේ ඇති බාල්දි ගණන වන අතර ආරම්භක ධාරිතාව හුදෙක් හැෂ් වගුව නිර්මාණය කරන අවස්ථාවේ ධාරිතාවය. හැෂ් වගුව විවෘතව ඇති බව සලකන්න: " hashcollision" නම්, තනි බාල්දියක් බහු ඇතුළත් කිරීම් ගබඩා කරයි, ඒවා අනුපිළිවෙලින් සෙවිය යුතුය. පැටවීමේ සාධකය යනු එහි ධාරිතාව ස්වයංක්‍රීයව වැඩි වීමට පෙර හැෂ් වගුව ලබා ගැනීමට කොපමණ ප්‍රමාණයක් ඉඩ දී ඇත්ද යන්නයි.

පෙරනිමි ආරම්භක ධාරිතාව (16) සහ පෙරනිමි පැටවුම් සාධකය (0.75) සහිත හිස් හැෂ් වගුවක් හැෂ්මැප් විසින් සාදයි . පෙරනිමි ආරම්භක ධාරිතාව (11) සහ පැටවුම් සාධකය / පිරවුම් අනුපාතය (0.75) සමඟ හැෂ්ටේබල් හිස් හැෂ් ටේබල් සාදන විට .

හැෂ් සිතියම සහ හැෂ්ටබල්

« එහි පූරක ගැටීමේ නඩුවේ ව්යුහාත්මක වෙනස්

HashMap, Hashtableහැෂ් isions ට්ටනයකදී ඔවුන් සිතියම් ඇතුළත් කිරීම් සම්බන්ධිත ලැයිස්තු වල ගබඩා කරයි. ජාවා 8 සිටHashMap හැෂ් බාල්දිය නිශ්චිත සීමාවෙන් ඔබ්බට වැඩෙන්නේ නම්, එම බාල්දිය මාරු වේ linked list of entries to a balanced tree. එය O (n) සිට O (ලොග් n) දක්වා නරකම කාර්ය සාධනය වැඩි දියුණු කරයි. ලැයිස්තුව ද්විමය වෘක්ෂයක් බවට පරිවර්තනය කරන අතරම, හැෂ් කේතය ශාඛා විචල්‍යයක් ලෙස භාවිතා කරයි. එකම බාල්දියේ විවිධ හැෂ් කේත දෙකක් තිබේ නම්, එකක් විශාල යැයි සලකන අතර ගසෙහි දකුණට ද අනෙක වමට ද වේ. නමුත් හැෂ් කේත දෙකම සමාන වන විට, HashMapයතුරු සැසඳිය හැකි යැයි උපකල්පනය කර, යම් අනුපිළිවෙලක් පවත්වා ගත හැකි වන පරිදි දිශාව තීරණය කිරීම සඳහා යතුර සංසන්දනය කරයි. HashMap සංසන්දනය කළ හැකි . බාල්දි ප්‍රමාණය ළඟා වුවහොත් ඇතුළත් කිරීම් එකතු කිරීමේදීTREEIFY_THRESHOLD = 8 පරිවර්තන සම්බන්ධිත ලැයිස්තුවේ සමතුලිත ගසකට යතුරු සෑදීම හොඳ පුරුද්දකි.TREEIFY_THRESHOLD අතර බොහෝ UNTREEIFY_THRESHOLD = 6විට සමතුලිත ගස සම්බන්ධිත ඇතුළත් කිරීම් ලැයිස්තුවට නැවත පරිවර්තනය කරනු ඇත.ජාවා 8 එස්ආර්සී , ස්ටක්පොස්ට්

« එකතු-දර්ශන පුනරාවර්තනය, අසාර්ථක-වේගවත් සහ අසාර්ථක-ආරක්ෂිත

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

Iteratorසොබාදහමේ අසාර්ථක වේගයකි. එනම්, එකතුවක් තමන්ගේම ඉවත් කිරීමේ () ක්‍රමයට අමතරව නැවත සැකසීමේදී වෙනස් කළ හොත් එය සමගාමී මෝඩිෆිකේෂන් එක්සෙප්ෂන් විසි කරයි. ලෙස එහිදී Enumerationඅසමත්-ආරක්ෂිත ස්වභාවය වේ. එකතුවක් නැවත සැකසීමේදී වෙනස් කළ හොත් එය කිසිදු ව්‍යතිරේකයක් නොදක්වයි.

ජාවා ඒපීඅයි ඩොක්ස් වලට අනුව, ගණනය කිරීමට වඩා ඉටරේටරය සැමවිටම කැමති වේ.

සටහන: ගණන් කිරීමේ අතුරුමුහුණතේ ක්‍රියාකාරිත්වය අනුපිටපත් අතුරුමුහුණත මඟින් අනුපිටපත් කර ඇත. ඊට අමතරව, අයිටරේටර් විකල්ප ඉවත් කිරීමේ මෙහෙයුමක් එක් කරන අතර කෙටි ක්‍රම නාම ඇත. නව ක්‍රියාත්මක කිරීම් ගණන් බැලීමට වඩා අයිටරේටර් භාවිතා කිරීම සලකා බැලිය යුතුය.

දී ජාවා 5 ConcurrentMap අතුරුමුහුණත හඳුන්වා : ConcurrentHashMap- ඉතා සමගාමී, ඉහළ කාර්ය ConcurrentMapක්රියාත්මක කිරීම හැෂ් වගුව මගින් පිටුබලය. නැවත ලබා ගැනීමේදී මෙම ක්‍රියාත්මක කිරීම කිසි විටෙකත් අවහිර නොවන අතර යාවත්කාලීන කිරීම් සඳහා සමගාමී මට්ටම තෝරා ගැනීමට සේවාදායකයාට ඉඩ දෙයි. එය පහත දැක්වෙන ආදේශකයක් ලෙස අදහස් කෙරේ Hashtable: ක්‍රියාත්මක කිරීමට අමතරව ConcurrentMap, එය සුවිශේෂී “උරුම” ක්‍රම සියල්ලටම සහය දක්වයි Hashtable.

  • සෑම HashMapEntryවටිනාකමක්ම වාෂ්පශීලී වන අතර එමඟින් විවාදාත්මක වෙනස් කිරීම් සහ පසු කියවීම් සඳහා සිහින් ධාන්ය අනුකූලතාවයක් සහතික කරයි; සෑම කියවීමක්ම මෑතකදී සම්පුර්ණ කරන ලද යාවත්කාලීන කිරීම පිළිබිඹු කරයි

  • අනුකාරක සහ ගණන් බැලීම් අසාර්ථකයි - අනුකාරක / ගණන් බැලීම් නිර්මාණය කිරීමෙන් පසු යම් අවස්ථාවක දී රාජ්‍යය පිළිබිඹු කරයි; අඩු අනුකූලතාවයේ පිරිවැය මත එකවර කියවීමට හා වෙනස් කිරීමට මෙය ඉඩ දෙයි. ඔවුන් සමගාමී මෝඩිෆිකේෂන් එක්සෙෂන් විසි නොකරයි. කෙසේ වෙතත්, iterator නිර්මාණය කර ඇත්තේ වරකට එක් නූල් එකක් පමණක් භාවිතා කිරීමටය.

  • මෙන් Hashtableනොව HashMap, මෙම පන්තිය ශුන්‍ය යතුරක් හෝ අගයක් ලෙස භාවිතා කිරීමට ඉඩ නොදේ.

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();
    }
}

« NULL යතුරු සහ NULL අගයන්

HashMapඋපරිම එක් ශුන්‍ය යතුරක් සහ ඕනෑම ශුන්‍ය අගයන් ගණනකට ඉඩ දෙයි. කොහෙද ලෙස Hashtableපවා තනි ශූන්ය යතුර සහ හිස් අගයක් ඉඩ දෙන්නේ නැහැ ප්රධාන හෝ අගය NULL එය NullPointerException අවුලට නම්. උදාහරණයක්

« වෙළඳ පොළෙන්, නූල් ආරක්ෂිත

Hashtableඅභ්‍යන්තරව සමමුහුර්ත කර ඇත. එබැවින් Hashtableබහු නූල් යෙදුම්වල භාවිතා කිරීම ඉතා ආරක්ෂිත වේ . කොහෙද ලෙස HashMapඅභ්යන්තර සමමුහුර්ත කර නැත. එබැවින් HashMapබාහිර සමමුහුර්තකරණයකින් තොරව බහු නූල් යෙදුම්වල භාවිතා කිරීම ආරක්ෂිත නොවේ . ඔබ බාහිර එකවර සිදුවීමට හැකි HashMapභාවිතා Collections.synchronizedMap()ක්රමය.

« කාර්ය සාධනය

ලෙස Hashtableඅභ්යන්තර සමමුහුර්ත නම්, මේ කරයි Hashtableතරමක් මන්දගාමී වඩා HashMap.


See බලන්න


18

නූල් කළ යෙදුම් සඳහා, ඔබට බොහෝ විට සමගාමී හැෂ්මැප් වෙතින් ගැලවිය හැකිය- එය ඔබගේ කාර්ය සාධන අවශ්‍යතා මත රඳා පවතී.


17

1. HashmapසහHashTable ගබඩා යතුර සහ වටිනාකම යන දෙකම.

2. Hashmapඑක් යතුරක් ලෙස ගබඩා කළ හැකිය null. Hashtableගබඩා කළ නොහැකnull .

3. HashMapසමමුහුර්ත කර නැත නමුත්Hashtable සමමුහුර්ත කර ඇත.

4. HashMapසමඟ සමමුහුර්ත කළ හැකියCollection.SyncronizedMap(map)

Map hashmap = new HashMap();

Map map = Collections.SyncronizedMap(hashmap);

16

දැනටමත් සඳහන් කර ඇති වෙනස්කම් හැරුණු විට, ජාවා 8 සිට HashMapසෑම බාල්දියකම භාවිතා කරන නෝඩ් (සම්බන්ධිත ලැයිස්තුව) ගතිකව ට්‍රයිනෝඩ්ස් (රතු-කළු ගස) මගින් ප්‍රතිස්ථාපනය කරන බව සැලකිල්ලට ගත යුතුය , එවිට ඉහළ හැෂ් isions ට්ටන පැවතුනද, නරකම අවස්ථාව සෙවීම යනු

HashMap Vs O (n) සඳහා O (ලොග් (n)) Hashtable.

* ඉහත සඳහන් වැඩි දියුණු කිරීම සඳහා ඉල්ලුම් කර නැත Hashtable, ඒත් පමණක් HashMap, LinkedHashMapසහ ConcurrentHashMap.

FYI, දැනට,

  • TREEIFY_THRESHOLD = 8 : බාල්දියක නෝඩ් 8 කට වඩා තිබේ නම්, සම්බන්ධිත ලැයිස්තුව සමබර ගසක් බවට පරිවර්තනය වේ.
  • UNTREEIFY_THRESHOLD = 6 : බාල්දියක් ඉතා කුඩා වූ විට (ඉවත් කිරීම හෝ ප්‍රමාණය වෙනස් කිරීම නිසා) ගස නැවත සම්බන්ධිත ලැයිස්තුවට පරිවර්තනය වේ.

14

HashTable සහ HashMaps සමඟ මූලික වෙනස්කම් 5 ක් ඇත.

  1. යතුරු, අගයන් සහ යතුරු-වටිනාකමේ යුගල දෙකම නැවත සැකසීමට සහ ලබා ගැනීමට සිතියම් ඔබට ඉඩ දෙයි, එහිදී හැෂ් ටේබල්ට මේ සියලු හැකියාවන් නොමැත.
  2. හැෂ්ටේබල් හි () අඩංගු ශ්‍රිතයක් ඇත, එය භාවිතා කිරීම ඉතා ව්‍යාකූල වේ. අඩංගු වන අර්ථය තරමක් අපගමනය වන බැවිනි. එහි තේරුම යතුර අඩංගු ද නැතිනම් වටිනාකම අඩංගු ද? තේරුම් ගැනීමට අපහසුය. සිතියම්වල අපට එකම දේ අඩංගු වන අතර එය තේරුම් ගැනීමට පහසුය.
  3. හැෂ්මැප් වලදී ඔබට ආරක්ෂිතව මූලද්‍රව්‍යය ඉවත් කළ හැකිය. හැෂ් ටේබල් වල එය කළ නොහැකි බැවින්.
  4. හැෂ් ටේබල් පෙරනිමියෙන් සමමුහුර්ත කර ඇති බැවින් එය බහු නූල් සමඟ පහසුවෙන් භාවිතා කළ හැකිය. පෙරනිමියෙන් හැෂ්මැප්ස් සමමුහුර්ත කර නොමැති බැවින් තනි නූල් සමඟ පමණක් භාවිතා කළ හැකිය. එකතුකිරීම් උපයෝගීතා පන්තියේ සමමුහුර්ත සිතියම් (සිතියම් එම්) ශ්‍රිතය භාවිතා කිරීමෙන් ඔබට තවමත් හැෂ්මැප් සමමුහුර්තකරණයට පරිවර්තනය කළ හැකිය.
  5. HashTable විසින් ශුන්‍ය යතුරු හෝ ශුන්‍ය අගයන්ට ඉඩ නොදේ. හෑෂ්මැප් එක් ශුන්‍ය යතුරකට සහ බහු ශුන්‍ය අගයන්ට ඉඩ දෙන තැන.

13

මගේ කුඩා දායකත්වය:

  1. පළමු හා අතර වඩාත් කැපී පෙනෙන වෙනස් Hashtableහා HashMap, එනම් HashMapනූල්-ආරක්ෂිත නැත අතර Hashtableනූල්-ආරක්ෂිත එකතුවකි.

  2. අතර දෙවැනි වැදගත් වෙනසක් Hashtableසහ HashMapකාර්ය සාධනය, සිට HashMapඑය වඩා වඩා හොඳ ඉටු සමමුහුර්ත නැත Hashtable.

  3. Hashtableඑදිරිව තෙවන වෙනස HashMapනම් Hashtableඑය යල්පැනගිය පන්තියක් වන අතර ඔබ ජාවා ConcurrentHashMapවෙනුවට භාවිතා කළ යුතුය Hashtable.


11

හැෂ්මැප්: එය java.util පැකේජය තුළ ඇති පන්තියක් වන අතර එය මූලද්‍රව්‍යය යතුරු සහ අගය ආකෘතියෙන් ගබඩා කිරීමට භාවිතා කරයි.

හැෂ්ටබල්: එය එකතු කිරීමේ රාමුව තුළ පිළිගැනීමට ලක්වන උරුම පන්තියකි.


එය එසේ නම්, එය පිළිතුරක් ලෙස නොව අදහස් දැක්වීම්වල තිබිය යුතුය.
මනිකන්ත් ගෞතම්

10

HashTable යනු jdk හි පැරණි පන්තියක් වන අතර එය තවදුරටත් භාවිතා නොකළ යුතුය. එහි භාවිතයන් සමගාමී හැෂ්මැප් සමඟ ප්‍රතිස්ථාපනය කරන්න . ඔබ නූල් ආරක්ෂාව, භාවිතය අවශ්ය නොවේ නම් නැහැ HashMap නොවන threadsafe නමුත් අඩු මතකය වේගවත් හා භාවිතා කරයි.


මක්නිසාද යත්, අනෙක් පිළිතුරු, ඒ අවස්ථාවේ දී, හැෂ්ටේබල් බැහැර නොකළ නමුත් එය නූල් ආරක්ෂිත බව පැහැදිලි කළ බැවිනි. සත්යය නම්, ඔබ හැෂ් ටේබල් කේතයෙන් දුටු විගසම, ඔබ එය පහරකින් තොරව සමගාමී හැෂ්මැප් සමඟ ප්රතිස්ථාපනය කළ යුතුය. නූල් ආරක්ෂාව ගැන සැලකිලිමත් නොවන්නේ නම් කාර්ය සාධනය ටිකක් වැඩි දියුණු කිරීමට හැෂ්මැප් භාවිතා කළ හැකිය.
jontejj

10
  1. Hashtableසමමුහුර්ත කර ඇති නමුත් HashMapඑසේ නොවේ.
  2. තවත් වෙනසක් නම්, එහි ඇති අනුකාරකය HashMapඅසාර්ථක-ආරක්ෂිත වන අතර ගණනය කිරීම Hashtableඑසේ නොවේ. නැවත සැකසීමේදී ඔබ සිතියම වෙනස් කරන්නේ නම්, ඔබ දැන ගනු ඇත.
  3. HashMapඑය තුළ ශුන්‍ය අගයන් සඳහා අවසර දෙයි Hashtable.

3
HashMap iterator අසාර්ථක-වේගවත් අසමත්-ආරක්ෂිත නොවේ. අපට සමගාමී හැෂ්මැප් ඇත්තේ එබැවිනි. මෙම පශ්චාත් පරීක්ෂා කරන්න journaldev.com/122/...
Pankaj

9

හැෂ්මැප් සහ හැෂ් ටේබල්

  • HashMap සහ HashTable පිළිබඳ වැදගත් කරුණු කිහිපයක්. කරුණාකර පහත විස්තර කියවන්න.

1) හැෂ් ටේබල් සහ හැෂ්මැප් java.util.Map අතුරුමුහුණත ක්‍රියාත්මක කරයි 2) හැෂ්මැප් සහ හැෂ්ටේබල් යන දෙකම හැෂ් පදනම් කරගත් එකතුවකි. සහ හැෂිං මත වැඩ කිරීම. එබැවින් මේවා හැෂ්මැප් සහ හැෂ් ටේබල් වල සමානකම් වේ.

  • HashMap සහ HashTable අතර වෙනස කුමක්ද?

1) පළමු වෙනස වන්නේ හැෂ්මැප් නූල් ආරක්ෂිත නොවන අතර හැෂ් ටේබල් ත්‍රෙඩ් සේෆ්
2) හැෂ්මැප් කාර්ය සාධනය අනුව වඩා හොඳ වන්නේ එය නූල් ආරක්ෂිත නොවන බැවිනි. හැෂ් ටේබල් කාර්ය සාධනය නැණවත් නොවන්නේ එය නූල් ආරක්ෂිත බැවිනි. එබැවින් බහු නූල් වලට එකවර හැෂ්ටේබල් වෙත පිවිසිය නොහැක.


2
පහත දැක්වෙන ඡන්දය ප්‍රකාශ කර ඇත්තේ මෙම පිළිතුර සමහර පැතිවලින් නිවැරදි නොවන බැවිනි. හැෂ්ටබල් සිතියම් අතුරුමුහුණත ක්‍රියාත්මක නොකරයි, නමුත් යල් පැන ගිය ශබ්ද කෝෂය පමණක් දීර් s කරයි.
යානිස් සර්මෙට්සියාඩිස්

8

Hashtable:

හැෂ්ටබල් යනු යතුරු අගය යුගලයේ අගයන් රඳවා ගන්නා දත්ත ව්‍යුහයකි. යතුරු සහ අගයන් දෙකටම එය ශුන්‍ය කිරීමට ඉඩ නොදේ. ඔබ NullPointerExceptionශුන්‍ය අගයක් එකතු කළහොත් ඔබට ලැබෙනු ඇත . එය සමමුහුර්ත කර ඇත. එබැවින් එය එහි පිරිවැය සමඟ පැමිණේ. ප්‍රවේශ විය හැක්කේ එක් නූල් එකකට පමණිHashTableනිශ්චිත වේලාවක .

උදාහරණය :

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));

    }
}

හැෂ්මැප්:

හැෂ්මැප් යනු හැෂ්ටේබල් වැනි ය, නමුත් එය යතුරු අගය යුගලයක් ද පිළිගනී. එය යතුරු සහ අගයන් දෙකටම ශුන්‍ය වීමට ඉඩ දෙයි. එහි ක්‍රියාකාරිත්වය වඩා හොඳය HashTable, මන්ද එය එසේ යunsynchronized .

උදාහරණයක්:

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));

    }
}

5

HashMapඅනුකරණය කර GWT client codeඇති අතර Hashtableඑසේ නොවන නමුත් භාවිතා කළ හැකිය .


එය apis දෙක අතර ඇති වෙනස්කම් පිළිබඳ සවිස්තරාත්මක විස්තරයක් ද?
IgorGanapolsky

ඔව් (sic!). GWT සංවර්ධකයින් ඒ ගැන දැනගත යුතු වන්නේ එපමණයි.
පොං

5

පැරණි සහ සම්භාව්‍ය මාතෘකාව, මෙය පැහැදිලි කරන මෙම ප්‍රයෝජනවත් බ්ලොග් අඩවිය එක් කිරීමට අවශ්‍යය:

http://blog.manishchhabra.com/2012/08/the-5-main-differences-betwen-hashmap-and-hashtable/

බ්ලොග් අඩවිය මනීෂ් චබ්රා විසිනි

ප්‍රධාන වෙනස්කම් 5 හැෂ්මැප් සහ හැෂ්ටබල් අතර වේ

HashMap සහ Hashtable යන දෙකම java.util.Map අතුරුමුහුණත ක්‍රියාත්මක කරන නමුත් වඩා කාර්යක්ෂම කේතයක් ලිවීමට ජාවා සංවර්ධකයින් තේරුම් ගත යුතු වෙනස්කම් කිහිපයක් තිබේ. ජාවා 2 වේදිකාව v1.2 වන විට, සිතියම් අතුරුමුහුණත ක්‍රියාත්මක කිරීම සඳහා හැෂ්ටබල් පන්තිය නැවත සකස් කරන ලද අතර එය ජාවා එකතු කිරීමේ රාමුවේ සාමාජිකයෙකු බවට පත් විය.

  1. HashMap සහ Hashtable අතර ඇති එක් ප්‍රධාන වෙනසක් නම්, HashMap සමමුහුර්ත කර නොමැති අතර Hashtable සමමුහුර්ත කර ඇති අතර, එයින් අදහස් වන්නේ Hashtable නූල්-ආරක්ෂිත වන අතර බහු නූල් අතර බෙදා ගත හැකි නමුත් නිසි සමමුහුර්තකරණයකින් තොරව HashMap බහු නූල් අතර බෙදා ගත නොහැක. ජාවා 5 හඳුන්වා දුන් අතර එය හැෂ්ටේබල් සඳහා විකල්පයක් වන අතර එය ජාවා හි හැෂ්ටේබල් වලට වඩා හොඳ පරිමාණයක් සපයයි. සමමුහුර්තකරණය යනු එක් වරකට හැෂ් වගුවක් වෙනස් කළ හැක්කේ එක් නූල් එකකට පමණි. මූලික වශයෙන්, එයින් අදහස් වන්නේ හැෂ් ටේබල් එකක යාවත්කාලීනයක් සිදු කිරීමට පෙර ඕනෑම නූලකට වස්තුවෙහි අගුලක් ලබා ගත යුතු අතර අනෙක් අය අගුල මුදා හරින තෙක් බලා සිටින බවයි.

  2. හැෂ්මැප් පන්තිය දළ වශයෙන් හැෂ්ටේබල් වලට සමාන වේ. (හැෂ්මැප් විසින් ශුන්‍ය අගයන් යතුර සහ අගය ලෙස ඉඩ දෙන අතර හැෂ්ටේබල් ශුන්‍යයට ඉඩ නොදේ).

  3. හැෂ්මැප් එදිරිව හැෂ් ටේබල් අතර ඇති තුන්වන වැදගත් වෙනස නම්, හැෂ්මෙප් හි ඉටරේටරය අසාර්ථක-වේගවත් ඉරේටරයක් ​​වන අතර, හැෂ් ටේබල් සඳහා ගණන් ගන්නා යන්ත්‍රය නොපවතින අතර, වෙනත් ත්‍රෙඩ් එකක් සිතියම ව්‍යුහාත්මකව වෙනස් කරන්නේ නම්, ඉටරේටරය විසින්ම ඉවත් කිරීම හැර වෙනත් මූලද්‍රව්‍යයක් එකතු කිරීම (ඉවත් කිරීම) ) ක්‍රමය. නමුත් මෙය සහතික කළ හැසිරීමක් නොවන අතර එය ජේවීඑම් විසින් උපරිම උත්සාහයෙන් කරනු ඇත. මෙය ජාවා හි ගණන් බැලීම සහ අනුකාරකය අතර වැදගත් වෙනසක් ද වේ.

  4. Hashtable සහ HashMap අතර ඇති තවත් කැපී පෙනෙන වෙනසක් වන්නේ නූල්-ආරක්ෂාව සහ සමමුහුර්තකරණය නිසා තනි නූල් සහිත පරිසරයක භාවිතා කරන්නේ නම් හැෂ්මෙප් හැෂ්මැප් වලට වඩා මන්දගාමී වීමයි. එබැවින් ඔබට සමමුහුර්තකරණය අවශ්‍ය නොවන්නේ නම් සහ හැෂ්මැප් භාවිතා කරන්නේ එක් නූල් එකකින් පමණක් නම්, එය ජාවා හි හැෂ්ටේබල් සිදු කරයි.

  5. කාලයාගේ ඇවෑමෙන් සිතියමේ අනුපිළිවෙල නියතව පවතින බවට හැෂ්මැප් සහතික නොවේ.

HashMap මගින් සමමුහුර්ත කළ හැකි බව සලකන්න

Map m = Collections.synchronizedMap(hashMap);

සාරාංශයේ දී ජාවා හි හැෂ්ටේබල් සහ හැෂ්මැප් අතර සැලකිය යුතු වෙනස්කම් තිබේ. උදා: නූල්-ආරක්ෂාව සහ වේගය සහ ඒ මත පදනම්ව ඔබට හැෂ් ටේබල් භාවිතා කරන්නේ ඔබට නූල්-ආරක්ෂාව අවශ්‍ය නම් පමණි, ඔබ ජාවා 5 ධාවනය කරන්නේ නම් ජාවා හි සමගාමී හැෂ්මැප් භාවිතා කිරීම ගැන සලකා බලන්න.


සමගාමී හැෂ්මැප් කියවීම-සමමුහුර්ත කර නොමැති අතර, හැෂ්ටබල් වේ. එබැවින් ඔබට ලිවීම් සමඟ එකවර කියවීමේ මෙහෙයුම් විශාල ප්‍රමාණයක් තිබේ නම්, දත්ත අඛණ්ඩතාව ගැන ඔබ සැලකිලිමත් වන්නේ නම් හැෂ්ටේබල් ඔබට වඩා හොඳ සේවාවක් ලබා දෙනු ඇත.
ඊගෝර්ගනාපොල්ස්කි

5

හැෂ්මැප් සහ හැෂ්ටේබල් යන දෙකම යතුරු සහ අගය ආකාරයෙන් දත්ත ගබඩා කිරීමට භාවිතා කරයි. දෙදෙනාම අද්විතීය යතුරු ගබඩා කිරීම සඳහා හැෂිං තාක්ෂණය භාවිතා කරයි. හැෂ්මැප් සහ හැෂ්ටබල් පන්ති අතර බොහෝ වෙනස්කම් පහත දක්වා ඇත.

රූප විස්තරය මෙහි ඇතුළත් කරන්න


ලස්සන දෘශ්‍ය සාරාංශයක්!
නඩ්ජිබ් මාමි
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.