ජාවා හි a HashMap
සහ a අතර ඇති වෙනස්කම් Hashtable
මොනවාද?
නූල් නොවන යෙදුම් සඳහා වඩා කාර්යක්ෂම වන්නේ කුමක්ද?
ConcurrentMap
වන නොවේ අවශ්ය මෙතන, ප්රශ්නය අර්ථය නිගමනයට / සමගාමී ප්රශ්නයක් නැහැ "-පොටවල් නොවන අයදුම්පත්" පවසන පරිදි.
ජාවා හි a HashMap
සහ a අතර ඇති වෙනස්කම් Hashtable
මොනවාද?
නූල් නොවන යෙදුම් සඳහා වඩා කාර්යක්ෂම වන්නේ කුමක්ද?
ConcurrentMap
වන නොවේ අවශ්ය මෙතන, ප්රශ්නය අර්ථය නිගමනයට / සමගාමී ප්රශ්නයක් නැහැ "-පොටවල් නොවන අයදුම්පත්" පවසන පරිදි.
Answers:
ජාවා HashMap
සහ අතර වෙනස්කම් කිහිපයක් තිබේ Hashtable
:
Hashtable
ඇත සමමුහුර්ත බැවින්ද, HashMap
නොවේ. මෙම නිසා, HashMap
-පොටවල් නොවන යෙදුම් සඳහා වඩා හොඳ, unsynchronized වස්තූන් සාමාන්යයෙන් සමමුහුර්ත අය වඩා හොඳ ඉටු විය.
Hashtable
null
යතුරු හෝ අගයන්ට ඉඩ නොදේ . HashMap
එක් null
යතුරක් සහ ඕනෑම null
අගයන් ගණනකට ඉඩ දෙයි .
හැෂ්මැප් හි උප පංති වලින් එකක් වන්නේ LinkedHashMap
, එබැවින් ඔබට පුරෝකථනය කළ හැකි පුනරාවර්තන අනුපිළිවෙලක් අවශ්ය නම් (එය පෙරනිමියෙන් ඇතුළත් කිරීමේ අනුපිළිවෙලයි), ඔබට පහසුවෙන් HashMap
a සඳහා මාරු විය හැකිය LinkedHashMap
. ඔබ භාවිතා කරන්නේ නම් මෙය එතරම් පහසු නොවනු ඇත Hashtable
.
සමමුහුර්තකරණය ඔබට ගැටළුවක් නොවන බැවින්, මම නිර්දේශ කරමි HashMap
. සමමුහුර්තකරණය ගැටලුවක් බවට පත්වුවහොත්, ඔබටද බැලිය හැකිය ConcurrentHashMap
.
Collections.synchronizedMap()
.
Hashtable
(“සෑම ක්රමයක්ම සමමුහුර්ත කිරීම මගින් ඕනෑම සහසම්බන්ධතා ගැටලු ගැන සැලකිලිමත් විය යුතුය!”) නූල් යෙදුම් සඳහා එය වඩාත් නරක අතට හැරෙන බව ද මම අදහස් කරමි . ඔබ බාහිරව සමමුහුර්ත කිරීම HashMap
(සහ ප්රතිවිපාක ගැන සිතීම) හෝ ConcurrentMap
ක්රියාත්මක කිරීමක් භාවිතා කිරීම වඩා හොඳය (සහ සමගාමී මුදල් සඳහා එහි දීර් API API ගසාකෑම). නිගමනය: භාවිතා කිරීමට ඇති එකම හේතුව Hashtable
වන්නේ උරුම API (ca. 1996 සිට) අවශ්ය වූ විටය.
සටහන, බොහෝ පිළිතුරු වල හැෂ්ටේබල් සමමුහුර්ත වී ඇති බව සඳහන් වේ. ප්රායෝගිකව මෙය ඔබ මිලදී ගන්නේ ඉතා අල්ප වශයෙනි. සමමුහුර්තකරණය ප්රවේශක / විකෘති ක්රම මඟින් සිතියමෙන් සමගාමීව නූල් දෙකක් එකතු කිරීම හෝ ඉවත් කිරීම නවත්වනු ඇත, නමුත් සැබෑ ලෝකයේ ඔබට බොහෝ විට අමතර සමමුහුර්තකරණය අවශ්ය වේ.
ඉතා සුලභ මෝඩකමක් නම් "පරීක්ෂා කර පසුව තබන්න" - එනම් ඇතුලත් කිරීමක් සොයන්න 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);
Hashtable
පැරණි කේතය ලෙස සැලකේ. ඒ ගැන කිසිවක් Hashtable
කළ නොහැක, HashMap
හෝ ව්යුත්පන්නයන් භාවිතා කළ නොහැක HashMap
, එබැවින් නව කේතය සඳහා, ආපසු යෑමට කිසිදු සාධාරණත්වයක් මා දකින්නේ නැත Hashtable
.
එකතු කිරීමේ පංතිවල නිවැරදි භාවිතය අපේක්ෂකයා තේරුම් ගෙන තිබේද සහ ලබා ගත හැකි විකල්ප විසඳුම් පිළිබඳව දැනුවත් දැයි පරීක්ෂා කිරීම සඳහා මෙම ප්රශ්නය බොහෝ විට සම්මුඛ පරීක්ෂණයේදී අසනු ලැබේ.
HashMap
පන්ති සඳහා දළ වශයෙන් සමාන වේ Hashtable
එය නොවන සමමුහුර්ත හා nulls අවසර ඇති බව හැර,. ( HashMap
ශුන්ය අගයන් යතුර සහ අගය ලෙස Hashtable
ඉඩ දෙන අතර null
s වලට ඉඩ නොදේ ).HashMap
කාලයාගේ ඇවෑමෙන් සිතියමේ අනුපිළිවෙල නියතව පවතින බවට සහතික නොවේ.HashMap
සමමුහුර්ත කර නොමැති අතර Hashtable
සමමුහුර්ත කර ඇත.HashMap
සඳහා ගණන් ගන්නා යන්ත්රය අසමත් වන අතර Hashtable
විසි කරන්න . නමුත් මෙය සහතික කළ හැසිරීමක් නොවන අතර එය ජේවීඑම් විසින් උපරිම උත්සාහයෙන් කරනු ඇත.ConcurrentModificationException
Iterator
remove()
සමහර වැදගත් කොන්දේසි පිළිබඳ සටහන:
Hashtable
වස්තුවෙහි අගුලක් ලබා ගත යුතු අතර අනෙක් අය අගුල මුදා හරින තෙක් බලා සිටින බවයි.set
එකතු කිරීම "ව්යුහාත්මකව" වෙනස් නොකරන බැවින් වෙනත් නූල් සඳහා ක්රමයට ආයාචනා කළ හැකිය. කෙසේ වෙතත්, ඇමතීමට පෙර set
, එකතුව ව්යුහාත්මකව වෙනස් කර ඇත, IllegalArgumentException
විසි කරනු ලැබේ.HashMap
මගින් සමමුහුර්ත කළ හැකිය
Map m = Collections.synchronizeMap(hashMap);
ගණන් බැලීමේ වස්තු හරහා පුනරාවර්තනය සඳහා support ජු සහාය වෙනුවට සිතියම එකතු කිරීමේ දර්ශන සපයයි. මෙම කොටසේ පසුව සාකච්ඡා කළ පරිදි එකතු කිරීමේ අදහස් අතුරු මුහුණතේ ප්රකාශන හැකියාව බෙහෙවින් වැඩි කරයි. යතුරු, අගයන් හෝ යතුරු-වටිනාකම් යුගල හරහා නැවත සැකසීමට සිතියම ඔබට ඉඩ දෙයි;
Hashtable
තෙවන විකල්පය සපයන්නේ නැත. පුනරාවර්තනය මධ්යයේ ඇතුළත් කිරීම් ඉවත් කිරීමට සිතියම ආරක්ෂිත ක්රමයක් සපයයි; Hashtable
නැත. අවසාන වශයෙන්, සිතියමෙහි සුළු අඩුපාඩුවක් නිරාකරණය කරයිHashtable
අතුරු මුහුණතේ .
ලබා දී ඇති අගයක් තිබේ Hashtable
නම් එය සත්ය බවට පත්වේ
Hashtable
. එහි නම අනුව, Hashtable
ලබා දී ඇති යතුරක් තිබේ නම් මෙම ක්රමය සත්ය වනු ඇතැයි ඔබ අපේක්ෂා කරනු ඇත , මන්ද යතුර a සඳහා මූලික ප්රවේශ යාන්ත්රණය වන Hashtable
බැවිනි. සිතියම් අතුරුමුහුණත ක්රමවේදය නැවත නම් කිරීමෙන් මෙම ව්යාකූල ප්රභවය ඉවත් කරයි
containsValue
. එසේම, මෙය අතුරු මුහුණතේ අනුකූලතාව වැඩි දියුණු කරයි -
containsValue
සමාන්තර containsKey
.
set
අ HashMap
. 3) පෙර වෙනසක් සිදුවී ඇත්නම් put(...)
මෙහෙයුම විසි නොවේ IllegalArgumentException
. 4) ඔබ සිතියම් ගත කිරීමක් වෙනස් කළහොත් අසාර්ථක-වේගවත් හැසිරීම HashMap
ද සිදුවේ. 5) අසමත් වේගයෙන් හැසිරීම වේ සහතික. (සහතික නොවන දෙය HashTable
නම් ඔබ සමගාමී වෙනස් කිරීමක් කළහොත් හැසිරීමයි. සත්ය හැසිරීම ... අනාවැකි කිව නොහැක.)
Hashtable
සිතියම් මූලද්රව්යයන්ගේ අනුපිළිවෙල කාලයත් සමඟ ස්ථාවර වන බවට සහතික නොවේ. (ඔබ සමහර විට ව්යාකූල Hashtable
වී ඇත LinkedHashMap
.)
thing.set(thing.get() + 1);
බොහෝ විට නවක වදය පුදුමයට පත් නොවී සම්පූර්ණයෙන්ම අනාරක්ෂිතයි, විශේෂයෙන් get()
සහ set()
සමමුහුර්ත ක්රම නම්. ඔවුන්ගෙන් බොහෝ දෙනෙක් මැජික් අපේක්ෂා කරති.
HashMap
: Map
අරාව සුචිගත කිරීම සඳහා හැෂ් කේත භාවිතා කරන අතුරු මුහුණත ක්රියාත්මක කිරීම .
Hashtable
: හායි, 1998 කැඳවීය. ඔවුන්ට ඔවුන්ගේ එකතු කිරීමේ API නැවත අවශ්ය වේ.
ඇත්තෙන්ම, ඔබ Hashtable
සම්පූර්ණයෙන්ම stay ත්ව සිටීම හොඳය . තනි-නූල් යෙදුම් සඳහා, ඔබට සමමුහුර්ත කිරීමේ අමතර පොදු අවශ්ය නොවේ. ඉහළ සමගාමී යෙදුම් සඳහා, ව්යාකූල සමමුහුර්තකරණය සාගින්න, අවහිරතා හෝ අනවශ්ය කසළ එකතු කිරීමේ විරාම වලට තුඩු දිය හැකිය. ටිම් හොව්ලන්ඩ් පෙන්වා දුන් පරිදි, ඔබට ConcurrentHashMap
ඒ වෙනුවට භාවිතා කළ හැකිය .
HashTable
ජාවා එකතු කිරීමේ රාමුව (JCF) හඳුන්වාදීමට පෙර එය පැරණි පන්තියක් වූ බව මතක තබා ගන්න Map
. ඒ නිසා විය Vector
හා Stack
.
එබැවින්, අනෙක් අය පෙන්වා දුන් පරිදි ජේසීඑෆ් හි සෑම විටම වඩා හොඳ විකල්පයක් ඇති බැවින් සෑම විටම ඔවුන්ගෙන් නව කේතයකින් stay ත්ව සිටින්න .
මෙන්න ඔබට ප්රයෝජනවත් වන ජාවා එකතු කිරීමේ වංචා පත්රය . අළු බ්ලොක් වල හැෂ් ටේබල්, දෛශික සහ ස්ටැක් යන පැරණි පන්තිය අඩංගු බව සලකන්න.
දැනටමත් පළ කර ඇති හොඳ පිළිතුරු බොහොමයක් තිබේ. මම නව කරුණු කිහිපයක් එකතු කර සාරාංශ කරමි.
HashMap
හා Hashtable
දෙකම ගබඩා කිරීම සඳහා භාවිතා වේ යතුර සහ අගය ස්වරූපයෙන් දත්ත . දෙදෙනාම අද්විතීය යතුරු ගබඩා කිරීම සඳහා හැෂිං තාක්ෂණය භාවිතා කරයි. නමුත් පහත දක්වා ඇති HashMap සහ Hashtable පන්ති අතර බොහෝ වෙනස්කම් තිබේ.
හැෂ්මැප්
HashMap
සමමුහුර්ත කර නොමැත. එය නූල් ආරක්ෂිත නොවන අතර නිසි සමමුහුර්ත කේතයකින් තොරව බොහෝ නූල් අතර බෙදා ගත නොහැක. HashMap
එක් ශුන්ය යතුරකට සහ බහු ශුන්ය අගයන්ට ඉඩ දෙයි. HashMap
යනු JDK 1.2 හි හඳුන්වා දුන් නව පන්තියකි. HashMap
වේගවත්. HashMap
මෙම කේතය ඇමතීමෙන් අපට සමමුහුර්ත කළ හැකියMap m = Collections.synchronizedMap(HashMap);
HashMap
ඉටරේටර් විසින් ගමන් කරයි. HashMap
අසාර්ථකයි. HashMap
සාරාංශ සිතියම් පන්තිය උරුම කර ගනී. කඩිනම්
Hashtable
සමමුහුර්ත කර ඇත. එය නූල්-ආරක්ෂිත වන අතර බොහෝ නූල් සමඟ බෙදා ගත හැකිය. Hashtable
කිසිදු ශුන්ය යතුරකට හෝ අගයකට ඉඩ නොදේ. Hashtable
උරුම පන්තියකි. Hashtable
මන්දගාමී වේ. Hashtable
අභ්යන්තරව සමමුහුර්ත කර ඇති අතර සමමුහුර්ත කළ නොහැක. Hashtable
ගණනය කරනු ලබන්නේ ගණන් ගැනීමේ යන්ත්රය සහ අනුකාරකය විසිනි. Hashtable
වේගවත් නොවේ. Hashtable
ශබ්ද කෝෂ පන්තියට උරුම වේ.වැඩිදුර කියවීම ජාවා හි හැෂ්මැප් සහ හැෂ්ටේබල් අතර වෙනස කුමක්ද?
Izb පැවසූ දෙයට අමතරව, HashMap
ශුන්ය අගයන් සඳහා ඉඩ ලබා දේ Hashtable
.
ජාවාඩොක්ස් තත්වය ලෙස යල්පැන ඇති අතර එය අතුරු මුහුණත මගින් ප්රතිස්ථාපනය කර ඇති පන්තිය Hashtable
දිගු කරන බව සලකන්න .Dictionary
Map
මෙම වගුව දෙස බලන්න. එය සමග විවිධ දත්ත ව්යුහ අතර සැසඳීම් සපයයි HashMap
හා Hashtable
. සංසන්දනය නිවැරදි, පැහැදිලි සහ තේරුම් ගැනීමට පහසුය.
Hashtable
හා සමාන වන HashMap
අතර සමාන අතුරු මුහුණතක් ඇත. ක්රම සමමුහුර්ත HashMap
කර ඇති බැවින්, ඔබට පැරණි යෙදුම් සඳහා සහය අවශ්ය නම් හෝ ඔබට සමමුහුර්තකරණය අවශ්ය නම් මිස භාවිතා කිරීම රෙකමදාරු කරනු Hashtables
ලැබේ. එබැවින් ඔබ බහු-නූල් නොවන HashMaps
බැවින් ඔබේ හොඳම ඔට්ටුව වේ.
හැෂ් ටේබල් සහ හැෂ්මැප් අතර ඇති තවත් ප්රධාන වෙනසක් නම්, හැෂ්මෙප් හි ඉටරේටරය අසාර්ථක-වේගවත් වන අතර, හැෂ් ටේබල් සඳහා ගණන් ගන්නා යන්ත්රය නොපවතින අතර, වෙනත් ඕනෑම ත්රෙඩ් එකක් සිතියම ව්යුහාත්මකව වෙනස් කරන්නේ නම්, ඉටරේටර්ගේම ඉවත් කිරීමේ () ක්රමය හැර. නමුත් මෙය සහතික කළ හැසිරීමක් නොවන අතර එය ජේවීඑම් විසින් උපරිම උත්සාහයෙන් කරනු ඇත.
මගේ මූලාශ්රය: http://javarevisited.blogspot.com/2010/10/difference-between-hashmap-and.html
දැනටමත් මෙහි සඳහන් කර ඇති අනෙකුත් සියලුම වැදගත් කරුණු වලට අමතරව, එකතු කිරීමේ 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 හි තිබේද?
HashTable සමමුහුර්ත කර ඇත, ඔබ එය තනි ත්රෙඩ් එකක භාවිතා කරන්නේ නම් ඔබට HashMap භාවිතා කළ හැකිය , එය සමමුහුර්ත නොකළ අනුවාදයකි. සමමුහුර්ත නොකළ වස්තූන් බොහෝ විට තව ටිකක් ක්රියාකාරී වේ. මාර්ගය වන විට, බහු නූල් එකවරම හැෂ්මැප් වෙත ප්රවේශ වන්නේ නම් සහ අවම වශයෙන් එක් නූල් එකක් සිතියම ව්යුහාත්මකව වෙනස් කරයි නම්, එය බාහිරව සමමුහුර්ත කළ යුතුය. සමමුහුර්ත කළ සිතියමකින් ඔබට සමමුහුර්ත නොකළ සිතියමක් ඔතා ගත හැකිය:
Map m = Collections.synchronizedMap(new HashMap(...));
HashTable හි අඩංගු විය හැක්කේ ශුන්ය නොවන වස්තුවක් යතුරක් ලෙස හෝ අගයක් ලෙස පමණි. HashMap හි එක් ශුන්ය යතුරක් සහ ශුන්ය අගයක් අඩංගු විය හැකිය.
සිතියම මඟින් ආපසු ලබා දෙන අනුකාරක අසාර්ථක වේ, සිතියම ව්යුහාත්මකව නවීකරණය කළ පසු ඕනෑම වේලාවක, එය ක්රියාකරුගේම ඉවත් කිරීමේ ක්රමවේදය හැරෙන්නට වෙනත් ආකාරයකින්, අනුකාරකය විසි කරයි ConcurrentModificationException
. මේ අනුව, සමගාමී වෙනස් කිරීම් හමුවේ, අනාගතයේ දී නිශ්චිත කාලයකදී අත්තනෝමතික, අධිෂ් non ානශීලී නොවන හැසිරීම් අවදානමට ලක් කරනවාට වඩා, ක්රියාකරු ඉක්මනින් හා පිරිසිදු ලෙස අසමත් වේ. ඇති ෙහයින්ද මෙම Enumerations Hashtable ගේ යතුරු සහ බලවේග විසින් ආපසු ක්රම අසමත් වේගයෙන් නොවේ.
හැෂ් ටේබල් සහ හැෂ්මැප් ජාවා එකතු කිරීමේ රාමුවේ සාමාජිකයෝ වෙති (ජාවා 2 වේදිකාව v1.2 සිට, සිතියම් අතුරුමුහුණත ක්රියාත්මක කිරීම සඳහා හැෂ් ටේබල් නැවත සකස් කරන ලදි).
හැෂ් ටේබල් උරුම කේතය ලෙස සලකනු ලබන අතර, නූල්-ආරක්ෂිත ඉහළ-සමගාමී ක්රියාත්මක කිරීමක් අවශ්ය නම්, හැෂ්ටේබල් වෙනුවට සමගාමී හැෂ්මැප් භාවිතා කිරීමට ප්රලේඛනය උපදෙස් දෙයි .
මූලද්රව්ය ආපසු ලබා දෙන අනුපිළිවෙල හැෂ්මැප් සහතික නොකරයි. හැෂ් ටේබල් සඳහා මම සිතන්නේ එය එක හා සමාන නමුත් මට සම්පූර්ණයෙන්ම විශ්වාස නැත, එය පැහැදිලිව සඳහන් කරන සම්පත් සොයාගත නොහැක.
HashMap
හා Hashtable
මෙන්ම සැලකිය යුතු Algorithmic වෙනස්කම් තිබේ. මීට පෙර කිසිවෙකු මෙය සඳහන් කර නැති නිසා මම එය ගෙන එන්නේ එබැවිනි. HashMap
ප්රමාණ දෙකක බලයක් සහිත හැෂ් වගුවක් සාදනු ඇත, ඕනෑම බාල්දියක ඔබට මූලද්රව්ය අටක් (isions ට්ටන) ඇති බැවින් එය ගතිකව වැඩි කරන අතර සාමාන්ය මූලද්රව්ය වර්ග සඳහා මූලද්රව්ය හොඳින් ඇවිස්සෙනු ඇත. කෙසේ වෙතත්Hashtable
ක්රියාත්මක කිරීම ඔබ කරන්නේ කුමක්දැයි ඔබ දන්නේ නම් හැෂිං සඳහා වඩා හොඳ සහ සියුම් පාලනයක් සපයයි, එනම් ඔබට වගු ප්රමාණය නිවැරදි කළ හැකිය. උදා: ඔබේ අගයන් ඩොමේන් ප්රමාණයට ආසන්නතම ප්රමුඛ අංකය භාවිතා කරමින් මෙය හැෂ්මැප් වලට වඩා හොඳ ක්රියාකාරීත්වයක් ලබා දෙනු ඇත. සමහර අවස්ථා සඳහා.
මෙම ප්රශ්නයේ දී පුළුල් ලෙස සාකච්ඡා කර ඇති පැහැදිලි වෙනස්කම් වලින් වෙන්ව, හැෂ් ටේබල් “මැනුවල් ඩ්රයිව්” මෝටර් රථයක් ලෙස මම දකිමි. එහිදී ඔබට හැෂිං සහ හැෂ්මැප් පාලනය කළ හැකිය.
මෙහි ඇති තොරතුරු මත පදනම්ව , මම හැෂ්මැප් සමඟ යාමට නිර්දේශ කරමි. මම හිතන්නේ ලොකුම වාසිය නම්, ඔබ එය නැවත ක්රියාත්මක කරන අතරතුර ජාවා එය වෙනස් කිරීමෙන් වලක්වනු ඇත, ඔබ එය අනුකාරකය හරහා නොකරන්නේ නම් පමණි.
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 ආරම්භක ධාරිතාව සහ පැටවීමේ සාධකය
ධාරිතාව යනු හැෂ් වගුවේ ඇති බාල්දි ගණන වන අතර ආරම්භක ධාරිතාව හුදෙක් හැෂ් වගුව නිර්මාණය කරන අවස්ථාවේ ධාරිතාවය. හැෂ් වගුව විවෘතව ඇති බව සලකන්න: " hash
collision
" නම්, තනි බාල්දියක් බහු ඇතුළත් කිරීම් ගබඩා කරයි, ඒවා අනුපිළිවෙලින් සෙවිය යුතුය. පැටවීමේ සාධකය යනු එහි ධාරිතාව ස්වයංක්රීයව වැඩි වීමට පෙර හැෂ් වගුව ලබා ගැනීමට කොපමණ ප්රමාණයක් ඉඩ දී ඇත්ද යන්නයි.
පෙරනිමි ආරම්භක ධාරිතාව (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 බලන්න
නූල් කළ යෙදුම් සඳහා, ඔබට බොහෝ විට සමගාමී හැෂ්මැප් වෙතින් ගැලවිය හැකිය- එය ඔබගේ කාර්ය සාධන අවශ්යතා මත රඳා පවතී.
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);
දැනටමත් සඳහන් කර ඇති වෙනස්කම් හැරුණු විට, ජාවා 8 සිට HashMap
සෑම බාල්දියකම භාවිතා කරන නෝඩ් (සම්බන්ධිත ලැයිස්තුව) ගතිකව ට්රයිනෝඩ්ස් (රතු-කළු ගස) මගින් ප්රතිස්ථාපනය කරන බව සැලකිල්ලට ගත යුතුය , එවිට ඉහළ හැෂ් isions ට්ටන පැවතුනද, නරකම අවස්ථාව සෙවීම යනු
HashMap
Vs O (n) සඳහා O (ලොග් (n)) Hashtable
.
* ඉහත සඳහන් වැඩි දියුණු කිරීම සඳහා ඉල්ලුම් කර නැත Hashtable
, ඒත් පමණක් HashMap
, LinkedHashMap
සහ ConcurrentHashMap
.
FYI, දැනට,
TREEIFY_THRESHOLD = 8
: බාල්දියක නෝඩ් 8 කට වඩා තිබේ නම්, සම්බන්ධිත ලැයිස්තුව සමබර ගසක් බවට පරිවර්තනය වේ.UNTREEIFY_THRESHOLD = 6
: බාල්දියක් ඉතා කුඩා වූ විට (ඉවත් කිරීම හෝ ප්රමාණය වෙනස් කිරීම නිසා) ගස නැවත සම්බන්ධිත ලැයිස්තුවට පරිවර්තනය වේ.HashTable සහ HashMaps සමඟ මූලික වෙනස්කම් 5 ක් ඇත.
මගේ කුඩා දායකත්වය:
පළමු හා අතර වඩාත් කැපී පෙනෙන වෙනස්
Hashtable
හාHashMap
, එනම්HashMap
නූල්-ආරක්ෂිත නැත අතරHashtable
නූල්-ආරක්ෂිත එකතුවකි.අතර දෙවැනි වැදගත් වෙනසක්
Hashtable
සහHashMap
කාර්ය සාධනය, සිටHashMap
එය වඩා වඩා හොඳ ඉටු සමමුහුර්ත නැතHashtable
.
Hashtable
එදිරිව තෙවන වෙනසHashMap
නම්Hashtable
එය යල්පැනගිය පන්තියක් වන අතර ඔබ ජාවාConcurrentHashMap
වෙනුවට භාවිතා කළ යුතුයHashtable
.
හැෂ්මැප්: එය java.util පැකේජය තුළ ඇති පන්තියක් වන අතර එය මූලද්රව්යය යතුරු සහ අගය ආකෘතියෙන් ගබඩා කිරීමට භාවිතා කරයි.
හැෂ්ටබල්: එය එකතු කිරීමේ රාමුව තුළ පිළිගැනීමට ලක්වන උරුම පන්තියකි.
HashTable යනු jdk හි පැරණි පන්තියක් වන අතර එය තවදුරටත් භාවිතා නොකළ යුතුය. එහි භාවිතයන් සමගාමී හැෂ්මැප් සමඟ ප්රතිස්ථාපනය කරන්න . ඔබ නූල් ආරක්ෂාව, භාවිතය අවශ්ය නොවේ නම් නැහැ HashMap නොවන threadsafe නමුත් අඩු මතකය වේගවත් හා භාවිතා කරයි.
Hashtable
සමමුහුර්ත කර ඇති නමුත් HashMap
එසේ නොවේ.HashMap
අසාර්ථක-ආරක්ෂිත වන අතර ගණනය කිරීම Hashtable
එසේ නොවේ. නැවත සැකසීමේදී ඔබ සිතියම වෙනස් කරන්නේ නම්, ඔබ දැන ගනු ඇත.HashMap
එය තුළ ශුන්ය අගයන් සඳහා අවසර දෙයි Hashtable
.හැෂ්මැප් සහ හැෂ් ටේබල්
1) හැෂ් ටේබල් සහ හැෂ්මැප් java.util.Map අතුරුමුහුණත ක්රියාත්මක කරයි 2) හැෂ්මැප් සහ හැෂ්ටේබල් යන දෙකම හැෂ් පදනම් කරගත් එකතුවකි. සහ හැෂිං මත වැඩ කිරීම. එබැවින් මේවා හැෂ්මැප් සහ හැෂ් ටේබල් වල සමානකම් වේ.
1) පළමු වෙනස වන්නේ හැෂ්මැප් නූල් ආරක්ෂිත නොවන අතර හැෂ් ටේබල් ත්රෙඩ් සේෆ්
2) හැෂ්මැප් කාර්ය සාධනය අනුව වඩා හොඳ වන්නේ එය නූල් ආරක්ෂිත නොවන බැවිනි. හැෂ් ටේබල් කාර්ය සාධනය නැණවත් නොවන්නේ එය නූල් ආරක්ෂිත බැවිනි. එබැවින් බහු නූල් වලට එකවර හැෂ්ටේබල් වෙත පිවිසිය නොහැක.
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));
}
}
HashMap
අනුකරණය කර GWT client code
ඇති අතර Hashtable
එසේ නොවන නමුත් භාවිතා කළ හැකිය .
පැරණි සහ සම්භාව්ය මාතෘකාව, මෙය පැහැදිලි කරන මෙම ප්රයෝජනවත් බ්ලොග් අඩවිය එක් කිරීමට අවශ්යය:
http://blog.manishchhabra.com/2012/08/the-5-main-differences-betwen-hashmap-and-hashtable/
බ්ලොග් අඩවිය මනීෂ් චබ්රා විසිනි
ප්රධාන වෙනස්කම් 5 හැෂ්මැප් සහ හැෂ්ටබල් අතර වේ
HashMap සහ Hashtable යන දෙකම java.util.Map අතුරුමුහුණත ක්රියාත්මක කරන නමුත් වඩා කාර්යක්ෂම කේතයක් ලිවීමට ජාවා සංවර්ධකයින් තේරුම් ගත යුතු වෙනස්කම් කිහිපයක් තිබේ. ජාවා 2 වේදිකාව v1.2 වන විට, සිතියම් අතුරුමුහුණත ක්රියාත්මක කිරීම සඳහා හැෂ්ටබල් පන්තිය නැවත සකස් කරන ලද අතර එය ජාවා එකතු කිරීමේ රාමුවේ සාමාජිකයෙකු බවට පත් විය.
HashMap සහ Hashtable අතර ඇති එක් ප්රධාන වෙනසක් නම්, HashMap සමමුහුර්ත කර නොමැති අතර Hashtable සමමුහුර්ත කර ඇති අතර, එයින් අදහස් වන්නේ Hashtable නූල්-ආරක්ෂිත වන අතර බහු නූල් අතර බෙදා ගත හැකි නමුත් නිසි සමමුහුර්තකරණයකින් තොරව HashMap බහු නූල් අතර බෙදා ගත නොහැක. ජාවා 5 හඳුන්වා දුන් අතර එය හැෂ්ටේබල් සඳහා විකල්පයක් වන අතර එය ජාවා හි හැෂ්ටේබල් වලට වඩා හොඳ පරිමාණයක් සපයයි. සමමුහුර්තකරණය යනු එක් වරකට හැෂ් වගුවක් වෙනස් කළ හැක්කේ එක් නූල් එකකට පමණි. මූලික වශයෙන්, එයින් අදහස් වන්නේ හැෂ් ටේබල් එකක යාවත්කාලීනයක් සිදු කිරීමට පෙර ඕනෑම නූලකට වස්තුවෙහි අගුලක් ලබා ගත යුතු අතර අනෙක් අය අගුල මුදා හරින තෙක් බලා සිටින බවයි.
හැෂ්මැප් පන්තිය දළ වශයෙන් හැෂ්ටේබල් වලට සමාන වේ. (හැෂ්මැප් විසින් ශුන්ය අගයන් යතුර සහ අගය ලෙස ඉඩ දෙන අතර හැෂ්ටේබල් ශුන්යයට ඉඩ නොදේ).
හැෂ්මැප් එදිරිව හැෂ් ටේබල් අතර ඇති තුන්වන වැදගත් වෙනස නම්, හැෂ්මෙප් හි ඉටරේටරය අසාර්ථක-වේගවත් ඉරේටරයක් වන අතර, හැෂ් ටේබල් සඳහා ගණන් ගන්නා යන්ත්රය නොපවතින අතර, වෙනත් ත්රෙඩ් එකක් සිතියම ව්යුහාත්මකව වෙනස් කරන්නේ නම්, ඉටරේටරය විසින්ම ඉවත් කිරීම හැර වෙනත් මූලද්රව්යයක් එකතු කිරීම (ඉවත් කිරීම) ) ක්රමය. නමුත් මෙය සහතික කළ හැසිරීමක් නොවන අතර එය ජේවීඑම් විසින් උපරිම උත්සාහයෙන් කරනු ඇත. මෙය ජාවා හි ගණන් බැලීම සහ අනුකාරකය අතර වැදගත් වෙනසක් ද වේ.
Hashtable සහ HashMap අතර ඇති තවත් කැපී පෙනෙන වෙනසක් වන්නේ නූල්-ආරක්ෂාව සහ සමමුහුර්තකරණය නිසා තනි නූල් සහිත පරිසරයක භාවිතා කරන්නේ නම් හැෂ්මෙප් හැෂ්මැප් වලට වඩා මන්දගාමී වීමයි. එබැවින් ඔබට සමමුහුර්තකරණය අවශ්ය නොවන්නේ නම් සහ හැෂ්මැප් භාවිතා කරන්නේ එක් නූල් එකකින් පමණක් නම්, එය ජාවා හි හැෂ්ටේබල් සිදු කරයි.
කාලයාගේ ඇවෑමෙන් සිතියමේ අනුපිළිවෙල නියතව පවතින බවට හැෂ්මැප් සහතික නොවේ.
HashMap මගින් සමමුහුර්ත කළ හැකි බව සලකන්න
Map m = Collections.synchronizedMap(hashMap);
සාරාංශයේ දී ජාවා හි හැෂ්ටේබල් සහ හැෂ්මැප් අතර සැලකිය යුතු වෙනස්කම් තිබේ. උදා: නූල්-ආරක්ෂාව සහ වේගය සහ ඒ මත පදනම්ව ඔබට හැෂ් ටේබල් භාවිතා කරන්නේ ඔබට නූල්-ආරක්ෂාව අවශ්ය නම් පමණි, ඔබ ජාවා 5 ධාවනය කරන්නේ නම් ජාවා හි සමගාමී හැෂ්මැප් භාවිතා කිරීම ගැන සලකා බලන්න.
හැෂ්මැප් සහ හැෂ්ටේබල් යන දෙකම යතුරු සහ අගය ආකාරයෙන් දත්ත ගබඩා කිරීමට භාවිතා කරයි. දෙදෙනාම අද්විතීය යතුරු ගබඩා කිරීම සඳහා හැෂිං තාක්ෂණය භාවිතා කරයි. හැෂ්මැප් සහ හැෂ්ටබල් පන්ති අතර බොහෝ වෙනස්කම් පහත දක්වා ඇත.