ConcurrentMap
হয় না প্রয়োজনীয় এখানে, যেমন প্রশ্ন বলে "অ থ্রেডেড অ্যাপ্লিকেশন" মানে থ্রেডিং / সম্পাতবিন্দু কোনো সমস্যা হয় না।
ConcurrentMap
হয় না প্রয়োজনীয় এখানে, যেমন প্রশ্ন বলে "অ থ্রেডেড অ্যাপ্লিকেশন" মানে থ্রেডিং / সম্পাতবিন্দু কোনো সমস্যা হয় না।
উত্তর:
জাভা HashMap
এবং এর Hashtable
মধ্যে বিভিন্ন পার্থক্য রয়েছে :
Hashtable
হয় সিঙ্ক্রোনাইজ , যেহেতু HashMap
নয়। এটি HashMap
নন-থ্রেডযুক্ত অ্যাপ্লিকেশনগুলির জন্য আরও ভাল করে তোলে , কারণ আনইনক্রোনাইজ করা অবজেক্টগুলি সাধারণত সিঙ্ক্রোনাইজ করাগুলির চেয়ে ভাল সম্পাদন করে।
Hashtable
null
কী বা মানগুলির অনুমতি দেয় না । HashMap
একটি null
কী এবং যে কোনও null
মানকে অনুমতি দেয়।
হ্যাশম্যাপের একটি সাবক্লাস হ'ল LinkedHashMap
, সুতরাং আপনি যদি ভবিষ্যদ্বাণীযোগ্য পুনরাবৃত্তির ক্রমটি চান (যা ডিফল্টরূপে সন্নিবেশনের ক্রম) চায় তবে আপনি খুব সহজেই এটির HashMap
জন্য একটি পরিবর্তন করতে পারবেন LinkedHashMap
। আপনি যদি ব্যবহার করছিলেন তবে এটি এত সহজ হবে না Hashtable
।
যেহেতু সিঙ্ক্রোনাইজেশন আপনার পক্ষে সমস্যা নয়, তাই আমি প্রস্তাব দেব HashMap
। যদি সিঙ্ক্রোনাইজেশন কোনও সমস্যা হয়ে যায় তবে আপনি এটিও দেখতে পারেন ConcurrentHashMap
।
Collections.synchronizedMap()
।
Hashtable
("প্রতিটি পদ্ধতি সিঙ্ক্রোনাইজ করা যেকোন সংগত সমস্যার যত্ন নেওয়া উচিত!") থ্রেডযুক্ত অ্যাপ্লিকেশনগুলির জন্য এটি আরও খারাপ করে তোলে । আপনি বাহ্যিকভাবে একটি HashMap
(এবং ফলাফলগুলি সম্পর্কে চিন্তাভাবনা) সিঙ্ক্রোনাইজ করা বা একটি ConcurrentMap
বাস্তবায়ন (এবং সম্মতিতে এর প্রসারিত এপিআই ব্যবহার করে) ব্যবহার করা ভাল। নীচের লাইন: Hashtable
যখন কোনও উত্তরাধিকার এপিআই (সিএ। 1996 থেকে) এর প্রয়োজন হয় কেবল তখনই ব্যবহার করার কারণ reason
দ্রষ্টব্য, যে প্রচুর উত্তরে জানানো হয় যে হ্যাশটেবল সিঙ্ক্রোনাইজ হয়েছে। অনুশীলনে এটি আপনাকে খুব কম কিনে। সিঙ্ক্রোনাইজেশনটি অ্যাকসেসরটিতে রয়েছে / মিউটেশন পদ্ধতিগুলি একই সাথে মানচিত্র থেকে দুটি থ্রেড যুক্ত করা বা সরানো বন্ধ করবে, তবে আসল বিশ্বে আপনার প্রায়শই অতিরিক্ত সংযোজন প্রয়োজন।
একটি সাধারণ প্রচলিত প্রথা হ'ল "চেক টু পুট" - অর্থাত্ একটিতে প্রবেশের সন্ধান করুন 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
)HashMap
মানচিত্রের ক্রমটি সময়ের সাথে স্থির থাকবে এমন কোনও গ্যারান্টি দেয় না।HashMap
সিঙ্ক্রোনাইজ থাকা অবস্থায় অ Hashtable
সিঙ্ক্রোনাইজড।HashMap
ব্যর্থ-নিরাপদ এবং অন্য কোনও থ্রেডের নিজস্ব পদ্ধতি ব্যতীত অন্য কোনও উপাদান যুক্ত বা মুছে ফেলার মাধ্যমে যদি মানচিত্রটি কাঠামোগতভাবে পরিবর্তন করে তবে Hashtable
নিক্ষেপ করুন । তবে এটি কোনও গ্যারান্টিযুক্ত আচরণ নয় এবং জেভিএম সেরা চেষ্টা করে এটি করবে।ConcurrentModificationException
Iterator
remove()
কিছু গুরুত্বপূর্ণ শর্তাদি নোট:
Hashtable
অবজেক্টে একটি লক অর্জন করতে হবে অন্যরা লকটি প্রকাশের জন্য অপেক্ষা করবে।set
পদ্ধতিটি আহ্বান করা সম্ভব যদিও এটি "কাঠামোগতভাবে" সংগ্রহটি সংশোধন করে না। তবে, কল করার আগে set
, সংগ্রহটি কাঠামোগতভাবে পরিবর্তন করা হয়েছে, IllegalArgumentException
নিক্ষেপ করা হবে।HashMap
দ্বারা সিঙ্ক্রোনাইজ করা যায়
Map m = Collections.synchronizeMap(hashMap);
মানচিত্র গণনা অবজেক্টগুলির মাধ্যমে পুনরাবৃত্তির জন্য সরাসরি সহায়তার পরিবর্তে সংগ্রহের ভিউ সরবরাহ করে। সংগ্রহের দর্শনগুলি এই বিভাগে পরে আলোচনা করা হয়েছে, ইন্টারফেসের ভাবগাম্ভীর্যতা ব্যাপকভাবে বৃদ্ধি করে। মানচিত্র আপনাকে কী, মান বা কী-মান জোড়ায় পুনরাবৃত্তি করতে দেয়;
Hashtable
তৃতীয় বিকল্প সরবরাহ করে না। মানচিত্র পুনরাবৃত্তির মাঝে প্রবেশগুলি সরানোর একটি নিরাপদ উপায় সরবরাহ করে; Hashtable
না। অবশেষে, মানচিত্র Hashtable
ইন্টারফেসে একটি সামান্য ঘাটতি পূরণ করে ।
Hashtable
রয়েছে বলে একটি পদ্ধতি রয়েছে যা Hashtable
একটি প্রদত্ত মান থাকে তবে এটি সত্য করে
। এর নাম দেওয়া, আপনি যদি এই Hashtable
প্রদত্ত কীটি ধারণ করে তবে এই পদ্ধতিটি সত্য হয়ে উঠবে বলে আপনি আশা করতে পারেন , কারণ কীটি এটির জন্য প্রাথমিক অ্যাক্সেস প্রক্রিয়া Hashtable
। মানচিত্র ইন্টারফেস পদ্ধতিটির নাম পরিবর্তন করে বিভ্রান্তির এই উত্সকে সরিয়ে দেয়
containsValue
। এছাড়াও, এটি ইন্টারফেসের সামঞ্জস্য - containsValue
সমান্তরাল উন্নতি করে
containsKey
।
set
তে কোনও অপারেশন নেই HashMap
। 3) পূর্ববর্তী পরিবর্তন থাকলে put(...)
অপারেশনটি নিক্ষেপ করবে না IllegalArgumentException
। 4) এর ব্যর্থ-ফাস্ট আচরণ HashMap
এছাড়াও ঘটে যদি আপনি একটি ম্যাপিং পরিবর্তন করুন। 5) ব্যর্থ-ফাস্ট আচরণ করা হয় নিশ্চিত। (গ্যারান্টিযুক্ত নয় এমনটি হ'ল HashTable
যদি আপনি একযোগে সংশোধন করে থাকেন তবে তার আচরণ actual আসল আচরণটি হ'ল ... অনুমানযোগ্য))
Hashtable
গ্যারান্টি দেয় না যে মানচিত্রের উপাদানগুলির ক্রমও সময়ের সাথে স্থিতিশীল থাকবে। (আপনি সম্ভবত বিভ্রান্তিকর হয় Hashtable
সঙ্গে LinkedHashMap
।)
thing.set(thing.get() + 1);
যা প্রায়শই অবাক হয়ে নবজাতককে পুরোপুরি অরক্ষিত হিসাবে ধরা দেয় না, বিশেষত যদি get()
এবং set()
সিঙ্ক্রোনাইজড পদ্ধতিগুলি হয়। তাদের অনেকেই যাদু আশা করছেন।
HashMap
: Map
ইন্টারফেসটির একটি বাস্তবায়ন যা কোনও অ্যারে সূচক করতে হ্যাশ কোড ব্যবহার করে।
Hashtable
: হাই, 1998 ডেকেছে। তারা তাদের সংগ্রহগুলি এপিআই ফিরে চায়।
গুরুতরভাবে যদিও, আপনি Hashtable
পুরোপুরি দূরে থাকাই ভাল । একক থ্রেডযুক্ত অ্যাপ্লিকেশনগুলির জন্য আপনার সিঙ্ক্রোনাইজেশনের অতিরিক্ত ওভারহেডের প্রয়োজন নেই। উচ্চতর যুগপত অ্যাপ্লিকেশনগুলির জন্য, ভৌতিক সিঙ্ক্রোনাইজেশন অনাহারী, অচলাবস্থা বা অপ্রয়োজনীয় আবর্জনা সংগ্রহ বিরতিতে পারে। টিম হাওল্যান্ড যেমন উল্লেখ করেছে, আপনি এর ConcurrentHashMap
পরিবর্তে ব্যবহার করতে পারেন ।
মনে রাখবেন যে HashTable
জাভা কালেকশন ফ্রেমওয়ার্ক (জেসিএফ) প্রবর্তনের আগে লিগ্যাসি ক্লাস ছিল এবং পরে Map
ইন্টারফেসটি প্রয়োগের জন্য এটি পুনরায় প্রেরণ করা হয়েছিল । তাই ছিল Vector
এবং Stack
।
সুতরাং, নতুন কোডে সর্বদা তাদের থেকে দূরে থাকুন, কারণ অন্যরা যেমন নির্দেশ করেছেন , জেসিএফ-তে সবসময় আরও ভাল বিকল্প রয়েছে ।
এখানে জাভা সংগ্রহের প্রতারণা শীটটি আপনাকে দরকারী মনে করবে। খেয়াল করুন ধূসর ব্লকটিতে উত্তরাধিকার শ্রেণি হ্যাশটবেল, ভেক্টর এবং স্ট্যাক রয়েছে।
ইতিমধ্যে পোস্ট অনেক ভাল উত্তর আছে। আমি কয়েকটি নতুন পয়েন্ট যুক্ত করছি এবং এর সংক্ষিপ্তসার করছি।
HashMap
এবং Hashtable
উভয়ই কী এবং মান আকারে ডেটা সঞ্চয় করতে ব্যবহৃত হয় । উভয়ই অনন্য কীগুলি সংরক্ষণ করতে হ্যাশিং কৌশল ব্যবহার করছেন। তবে হ্যাশম্যাপ এবং হ্যাশটেবল শ্রেণীর মধ্যে অনেকগুলি পার্থক্য রয়েছে যা নীচে দেওয়া হয়েছে।
হ্যাশ মানচিত্র
HashMap
অ সিঙ্ক্রোনাইজড। এটি থ্রেড নিরাপদ নয় এবং যথাযথ সিঙ্ক্রোনাইজেশন কোড ব্যতীত অনেক থ্রেডের মধ্যে ভাগ করা যায় না। HashMap
একটি নাল কী এবং একাধিক নাল মানকে অনুমতি দেয়। HashMap
জেডিকে ১.২ এ প্রবর্তিত একটি নতুন শ্রেণি। HashMap
দ্রুত. HashMap
এই কোডটি কল করে আমরা এটিকে সিঙ্ক্রোনাইজ করতে পারিMap m = Collections.synchronizedMap(HashMap);
HashMap
Iterator দ্বারা অনুসরণ করা হয়। HashMap
ব্যর্থ - দ্রুত। HashMap
অ্যাবস্ট্রাকম্যাপ ক্লাস উত্তরাধিকারসূত্রে প্রাপ্ত। হ্যাশ টেবিল
Hashtable
সিঙ্ক্রোনাইজ করা হয়। এটি থ্রেড-নিরাপদ এবং অনেক থ্রেডের সাথে ভাগ করা যায়। Hashtable
কোনও নাল কী বা মানকে অনুমতি দেয় না। Hashtable
একটি উত্তরাধিকার শ্রেণি। Hashtable
ধীর. Hashtable
অভ্যন্তরীণভাবে সিঙ্ক্রোনাইজড এবং সিঙ্ক-সিঙ্ক করা যাবে না। Hashtable
গণক এবং Iterator দ্বারা অনুসরণ করা হয়। Hashtable
ব্যর্থ-দ্রুত নয়। Hashtable
অভিধান ক্লাস উত্তরাধিকারসূত্রে প্রাপ্ত।আরও পঠন জাভায় হ্যাশম্যাপ এবং হ্যাশটেবলের মধ্যে পার্থক্য কী?
Izb যা বলেছিল তা ছাড়াও HashMap
নাল মানকে মঞ্জুরি দেয়, যেখানে Hashtable
হয় না।
এছাড়াও লক্ষ করুন যে জাভাডোকস রাজ্য হিসাবে অবিচ্ছিন্ন এবং ইন্টারফেস দ্বারা প্রতিস্থাপন করা হয়েছে , যা শ্রেণি Hashtable
প্রসারিত করে ।Dictionary
Map
এই চার্টটি একবার দেখুন। এটি HashMap
এবং পাশাপাশি বিভিন্ন ডেটা স্ট্রাকচারের মধ্যে তুলনা সরবরাহ করে Hashtable
। তুলনাটি নির্ভুল, স্পষ্ট এবং সহজে বোঝা যায়।
Hashtable
অনুরূপ HashMap
এবং একই ইন্টারফেস আছে। পদ্ধতিগুলি HashMap
সিঙ্ক্রোনাইজ হওয়ার কারণে আপনার যদি উত্তরাধিকার অ্যাপ্লিকেশনগুলির জন্য সমর্থন প্রয়োজন না হয় বা আপনার সিঙ্ক্রোনাইজেশন প্রয়োজন হয় না তবে আপনি ব্যবহার Hashtables
করার পরামর্শ দেওয়া হয়। সুতরাং আপনার ক্ষেত্রে যেমন আপনি মাল্টি-থ্রেডিং নয়, HashMaps
তবে আপনার সেরা বাজি।
হ্যাশটেবল এবং হ্যাশম্যাপের মধ্যে আরেকটি মূল পার্থক্য হ্যাশমে্যাপে ইলিট্রেটার ব্যর্থ-দ্রুত এবং হ্যাশট্যাবলের জন্য গণক না থাকলে এবং যদি কোনও অন্য থ্রেড আইট্রেটরের নিজস্ব অপসারণ () পদ্ধতি ব্যতীত কোনও উপাদান যুক্ত বা মুছে কাঠামোগতভাবে মানচিত্রটি পরিবর্তন করে। তবে এটি কোনও গ্যারান্টিযুক্ত আচরণ নয় এবং জেভিএম সর্বাত্মক প্রচেষ্টায় এটি করবে।
আমার উত্স: http://javarevisited.blogspot.com/2010/10/differences-between-hashmap-and.html
ইতিমধ্যে এখানে বর্ণিত অন্যান্য সমস্ত গুরুত্বপূর্ণ দিকের পাশাপাশি, জাভা স্পেসে "সর্বশেষ এবং সর্বশ্রেষ্ঠ" সংযোজন অনুসারে কালেকশন এপিআই (যেমন মানচিত্র ইন্টারফেস) সর্বদা সংশোধন করা হচ্ছে।
উদাহরণস্বরূপ, জাভা 5 মানচিত্র পুনরাবৃত্তি তুলনা করুন:
for (Elem elem : map.keys()) {
elem.doSth();
}
বনাম পুরাতন হ্যাশটেবল পদ্ধতির:
for (Enumeration en = htable.keys(); en.hasMoreElements(); ) {
Elem elem = (Elem) en.nextElement();
elem.doSth();
}
জাভা ১.৮-এ আমরা পুরানো স্ক্রিপ্টিং ভাল ভাষার মতো হ্যাশম্যাপগুলি তৈরি এবং অ্যাক্সেস করতে সক্ষম হওয়ার প্রতিশ্রুতি দেওয়া হয়েছিল:
Map<String,Integer> map = { "orange" : 12, "apples" : 15 };
map["apples"];
আপডেট: না, তারা 1.8 এ অবতরণ করবে না ... :(
হ্যাশ টেবিলটি সিঙ্ক্রোনাইজ করা হয়েছে, আপনি যদি এটি একটি একক থ্রেডে ব্যবহার করেন তবে আপনি হ্যাশম্যাপ ব্যবহার করতে পারেন , এটি একটি সিনক্রোনাইজ করা সংস্করণ। আনসিঙ্ক্রোনাইজ করা অবজেক্টগুলি প্রায়শই একটু বেশি পারফরম্যান্ট হয়। উপায় দ্বারা যদি একাধিক থ্রেড একই সাথে একটি হ্যাশম্যাপ অ্যাক্সেস করে এবং কমপক্ষে একটি থ্রেড মানচিত্রকে কাঠামোগত পরিবর্তন করে তবে অবশ্যই এটি বাহ্যিকভাবে সিঙ্ক্রোনাইজ করা উচিত। ইউন ব্যবহার করে একটি সিঙ্ক্রোনাইজড মানচিত্রে একটি অযৌক্তিক মানচিত্রটি মোড়তে পারেন:
Map m = Collections.synchronizedMap(new HashMap(...));
হ্যাশ টেবিলটিতে কেবল একটি কী বা মান হিসাবে নন-নাল অবজেক্ট থাকতে পারে। হ্যাশম্যাপে একটি নাল কী এবং নাল মান থাকতে পারে।
মানচিত্রে ফিরে আসা পুনরাবৃত্তকারীগুলি ব্যর্থ-দ্রুত হয়, যদি মানচিত্রটি পুনরুক্তি তৈরির পরে যেকোন সময় কাঠামোগতভাবে সংশোধন করা হয় তবে পুনরাবৃত্তির নিজস্ব অপসারণের পদ্ধতিটি বাদ দিয়ে পুনরুক্তিটি একটি নিক্ষেপ করবে ConcurrentModificationException
। সুতরাং, একযোগে পরিবর্তনের মুখে, পুনরুক্তিকারী ভবিষ্যতে একটি নির্ধারিত সময়ে স্বেচ্ছাসেবক, অ-সংজ্ঞাবহ আচরণের ঝুঁকির চেয়ে দ্রুত এবং পরিষ্কার ব্যর্থ হয়। যেখানে Enumerations hashtable এর কী ও উপাদান পদ্ধতি দ্বারা ফিরে ব্যর্থ-ফাস্ট নয়।
হ্যাশ টেবিল এবং হ্যাশম্যাপ জাভা সংগ্রহ ফ্রেমওয়ার্কের সদস্য (জাভা 2 প্ল্যাটফর্ম v1.2, যেহেতু হ্যাশ টেবিলটি মানচিত্র ইন্টারফেসটি প্রয়োগ করতে পুনরায় প্রেরণ করা হয়েছিল)।
Hashtable উত্তরাধিকার কোড, ব্যবহার করতে ডকুমেন্টেশন পরামর্শ বিবেচনা করা হয় ConcurrentHashMap hashtable স্থানে যদি একটি থ্রেড-নিরাপদ অত্যন্ত সমবর্তী বাস্তবায়ন আকাঙ্ক্ষিত হয়।
হ্যাশম্যাপ আদেশগুলিতে যে উপাদানগুলিতে ফিরে আসে তার গ্যারান্টি দেয় না। হ্যাশ টেবিলের জন্য আমি অনুমান করি যে এটি একই রকম তবে আমি সম্পূর্ণ নিশ্চিত নই, আমি কোনও রিসোর্স পাই না যা স্পষ্টভাবে জানিয়েছে state
HashMap
এবং Hashtable
পাশাপাশি উল্লেখযোগ্য অ্যালগোরিদমিক পার্থক্য রয়েছে। এর আগে কেউ এটি উল্লেখ করেনি তাই আমি এটিকে সামনে আনছি। HashMap
দুটি আকারের শক্তির সাথে একটি হ্যাশ টেবিল তৈরি করবে, এটি গতিশীলরূপে বাড়িয়ে দেবে যে আপনার কোনও বালতিতে প্রায় আটটি উপাদান (সংঘর্ষ) রয়েছে এবং সাধারণ উপাদান ধরণের জন্য উপাদানগুলি খুব ভালভাবে আলোড়িত করবে। তবে, Hashtable
বাস্তবায়ন হ্যাশিংয়ের উপর আরও ভাল এবং সূক্ষ্ম নিয়ন্ত্রণ সরবরাহ করে যদি আপনি জানেন যে আপনি কী করছেন, যেমন আপনি টেবিলের আকারটি ব্যবহার করে উদাহরণস্বরূপ আপনার মানগুলির ডোমেন আকারের নিকটতম প্রাইম সংখ্যাটি ব্যবহার করতে পারেন এবং এর ফলে হাশম্যাপের চেয়ে কম পারস্পরিক সংঘর্ষের তুলনায় আরও ভাল পারফরম্যান্স হবে কিছু ক্ষেত্রে।
এই প্রশ্নে ব্যাপকভাবে আলোচিত স্পষ্ট পার্থক্যগুলি থেকে পৃথক করুন, আমি হ্যাশটবেলটিকে একটি "ম্যানুয়াল ড্রাইভ" গাড়ি হিসাবে দেখছি যেখানে হ্যাশিংয়ের উপর আপনার আরও ভাল নিয়ন্ত্রণ রয়েছে এবং হ্যাশম্যাপকে "স্বয়ংক্রিয় ড্রাইভ" পাল্টা হিসাবে দেখা যায় যা সাধারণত ভাল সম্পাদন করবে।
এখানে তথ্যের ভিত্তিতে , আমি হ্যাশম্যাপের সাথে যাওয়ার পরামর্শ দিই। আমি মনে করি সবচেয়ে বড় সুবিধাটি হ'ল জাভা আপনাকে এটির পরিবর্তন থেকে বিরত রাখবে আপনি যখন এটির পুনরাবৃত্তি করতে না পারেন, যদি না আপনি পুনরায় এটির মাধ্যমে এটি করেন।
এ Collection
- কখনও কখনও একটি ধারক বলা হয় - কেবল এমন এক জিনিস যা একাধিক উপাদানকে একক ইউনিটে ভাগ করে দেয়। Collection
গুলি সামগ্রিক ডেটা সঞ্চয়, পুনরুদ্ধার, কৌশল এবং যোগাযোগের জন্য ব্যবহৃত হয়। সংগ্রহের কাঠামো ডাব্লু হ'ল সংগ্রহগুলি উপস্থাপন এবং পরিচালনা করার জন্য একীভূত স্থাপত্য।
HashMap
JDK1.2
এবং hashtable JDK1.0
, উভয় বস্তু যা মধ্যে প্রতিনিধিত্ব করা হয় একটি গ্রুপ প্রতিনিধিত্ব করতে ব্যবহৃত হয় <Key, Value>
জোড়া। প্রতিটি <Key, Value>
জুটিকে Entry
অবজেক্ট বলা হয় । এন্ট্রির সংগ্রহ বস্তু দ্বারা উল্লেখ করা হয় HashMap
এবং Hashtable
। কোনও সংগ্রহে থাকা কীগুলি অবশ্যই অনন্য বা স্বতন্ত্র হতে হবে। [যেহেতু তারা কোনও ম্যাপযুক্ত মান একটি নির্দিষ্ট কী পুনরুদ্ধার করতে ব্যবহৃত হয়। সংগ্রহের মানগুলি নকল করা যায়]]
« সুপারক্লাস, উত্তরাধিকার এবং সংগ্রহ ফ্রেমওয়ার্ক সদস্য
হ্যাশটেবল হ'ল একটি উত্তরাধিকার শ্রেণি 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 { ... }
« প্রাথমিক ক্ষমতা এবং লোড ফ্যাক্টর
ক্ষমতা হ্যাশ টেবিলের বালতি সংখ্যা, এবং প্রাথমিক ক্ষমতা কেবল হ্যাশ টেবিল তৈরি করার সময় ক্ষমতা হয়। নোট করুন যে হ্যাশ টেবিলটি উন্মুক্ত: " hash
collision
" " " ক্ষেত্রে , একটি একক বালতি একাধিক এন্ট্রি সঞ্চয় করে, যা অবশ্যই ক্রমানুসারে অনুসন্ধান করা উচিত। লোড ফ্যাক্টর একটি পরিমাপ যা হ্যাশ টেবিলটি তার ক্ষমতা স্বয়ংক্রিয়ভাবে বৃদ্ধির আগে কীভাবে পূর্ণ হতে পারে।
হ্যাশম্যাপ ডিফল্ট প্রাথমিক ক্ষমতা (16) এবং ডিফল্ট লোড ফ্যাক্টর (0.75) দিয়ে একটি খালি হ্যাশ টেবিল তৈরি করে । যেখানে হ্যাশটেবল একটি ডিফল্ট প্রাথমিক ক্ষমতা (11) এবং লোড ফ্যাক্টর / ফিল অনুপাত (0.75) দিয়ে খালি হ্যাশট্যাবল তৈরি করে ।
« হ্যাশ সংঘর্ষের ক্ষেত্রে কাঠামোগত পরিবর্তন
HashMap
, Hashtable
হ্যাশের সংঘর্ষের ক্ষেত্রে তারা লিঙ্কযুক্ত তালিকায় মানচিত্রের এন্ট্রিগুলি সঞ্চয় করে। জাভা 8 থেকেHashMap
যদি হ্যাশ বালতিটি একটি নির্দিষ্ট প্রান্তিকের বাইরে বেড়ে যায় তবে সেই বালতিটি সেখান থেকে স্যুইচ করবে linked list of entries to a balanced tree
। যা ও (এন) থেকে ও (লগ এন) এর নিকৃষ্টতম কর্মক্ষমতা উন্নত করে improve বাইনারি ট্রিতে তালিকাটি রূপান্তর করার সময়, হ্যাশকোডটি একটি ব্রাঞ্চিং ভেরিয়েবল হিসাবে ব্যবহৃত হয়। যদি একই বালতিতে দুটি পৃথক হ্যাশকোড থাকে তবে একটিকে বড় হিসাবে বিবেচনা করা হবে এবং গাছের ডানদিকে এবং অন্যটি বাম দিকে যান। তবে উভয় হ্যাশকোড সমান হলে, HashMap
ধরে নেওয়া হয় যে কীগুলি তুলনাযোগ্য, এবং দিকটি নির্ধারণ করার জন্য কীটি তুলনা করে যাতে কিছু অর্ডার বজায় রাখা যায়। এটা তোলে কি করতে একটি ভাল অভ্যাস HashMap
তুলনীয় । বালতি আকার পৌঁছেছে এন্ট্রি যোগ করার সময়TREEIFY_THRESHOLD = 8
একটি সুষম গাছকে এন্ট্রি যুক্ত তালিকা রূপান্তর করে, কম এন্ট্রি অপসারণ TREEIFY_THRESHOLD
এবং সর্বাধিক UNTREEIFY_THRESHOLD = 6
এন্ট্রির লিঙ্ক লিস্টে সুষম গাছ reconvert হবে। জাভা 8 এসআরসি , স্ট্যাকপোস্ট
« সংগ্রহ-দেখার পুনরাবৃত্তি, ব্যর্থ-দ্রুত এবং ব্যর্থ-নিরাপদ
+--------------------+-----------+-------------+
| | Iterator | Enumeration |
+--------------------+-----------+-------------+
| Hashtable | fail-fast | safe |
+--------------------+-----------+-------------+
| HashMap | fail-fast | fail-fast |
+--------------------+-----------+-------------+
| ConcurrentHashMap | safe | safe |
+--------------------+-----------+-------------+
Iterator
প্রকৃতির একটি ব্যর্থ দ্রুত। অর্থাত্ যদি এটি সংগ্রহের নিজস্ব অপসারণ () পদ্ধতি ব্যতীত অন্যটির পুনরাবৃত্তি করার সময় কোনও সংশোধন করা হয় তবে এটি কনকন্টারমোডিফিকেশন এক্সেক্সশনটি ছুড়ে ফেলে। Enumeration
প্রকৃতির যেখানে ব্যর্থ-নিরাপদ। পুনরুক্তি করার সময় যদি কোনও সংশোধন করা হয় তবে এটি কোনও ব্যতিক্রম ছুঁড়ে না।
জাভা এপিআই ডক্স অনুসারে, গণনার তুলনায় আইট্রেটর সর্বদা পছন্দ করা হয়।
দ্রষ্টব্য: গণনা ইন্টারফেসের কার্যকারিতা Iterator ইন্টারফেস দ্বারা নকল করা হয়। এছাড়াও, আইট্রেটর একটি teচ্ছিক অপসারণ অপারেশন যুক্ত করে এবং এর পদ্ধতির নামগুলি ছোট হয়। নতুন বাস্তবায়নের ক্ষেত্রে গণনার অগ্রাধিকারের ক্ষেত্রে আইট্রেটার ব্যবহার করা বিবেচনা করা উচিত।
ইন জাভা 5 চালু ConcurrentMap ইন্টারফেস : ConcurrentHashMap
- একটি অত্যন্ত সমবর্তী, উচ্চ ক্ষমতা সম্পন্ন ConcurrentMap
বাস্তবায়ন একটি হ্যাশ সারণী। পুনরুদ্ধারগুলি সম্পাদন করার সময় এই বাস্তবায়ন কখনই বাধা দেয় না এবং ক্লায়েন্টকে আপডেটের জন্য সম্মতি স্তর নির্বাচন করতে দেয়। এটি এর জন্য একটি ড্রপ-ইন প্রতিস্থাপন হিসাবে লক্ষ্য করা হয়েছে Hashtable
: বাস্তবায়নের পাশাপাশি ConcurrentMap
এটি অদ্ভুতভাবে "উত্তরাধিকার" পদ্ধতিগুলিকে সমর্থন করে Hashtable
।
প্রতিটি HashMapEntry
মান মান অবাধ্য হয় যার ফলে বিতর্কিত পরিবর্তন এবং পরবর্তী পাঠগুলির জন্য সূক্ষ্ম শস্যের সামঞ্জস্যতা নিশ্চিত করা হয়; প্রতিটি পঠন সর্বাধিক সমাপ্ত আপডেট প্রতিফলিত করে
আইট্রেটার এবং গণনাগুলি ব্যর্থ নিরাপদ - পুনরুক্তি / গণনার তৈরির পরে কোনও এককালে রাষ্ট্রকে প্রতিফলিত করে; এটি হ্রাস করা ধারাবাহিকতার দামে একযোগে পাঠ এবং পরিবর্তন করার অনুমতি দেয়। তারা সমকালীন মডিডিফিকেশনটি ছুঁড়ে না। যাইহোক, পুনরাবৃত্তিগুলি একবারে কেবল একটি থ্রেড দ্বারা ব্যবহার করার জন্য ডিজাইন করা হয়।
পছন্দ 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();
}
}
« নাল কী ও নাল মান
HashMap
সর্বাধিক একটি নাল কী এবং যে কোনও নাল মানকে অনুমতি দেয়। যেখানে Hashtable
কোনও একক নাল কী এবং নাল মানকেও মঞ্জুরি দেয় না, যদি কী বা মান নাল হয় তবে এটি নালপয়েন্টার এক্সসেপশনকে ছুঁড়ে দেয়। উদাহরণ
« সিঙ্ক্রোনাইজড, থ্রেড সেফ
Hashtable
অভ্যন্তরীণভাবে সিঙ্ক্রোনাইজ করা হয়। সুতরাং, Hashtable
মাল্টি থ্রেড অ্যাপ্লিকেশনগুলিতে এটি ব্যবহার করা খুব নিরাপদ । যেখানে HashMap
অভ্যন্তরীণভাবে সিঙ্ক্রোনাইজ করা হয় না। অতএব, HashMap
বহিরাগত সুসংহতকরণ ছাড়া মাল্টি থ্রেড অ্যাপ্লিকেশনগুলিতে ব্যবহার করা নিরাপদ নয় । আপনি পদ্ধতিটি HashMap
ব্যবহার করে বাহ্যিকভাবে সিঙ্ক্রোনাইজ করতে পারেন Collections.synchronizedMap()
।
Formance পারফরম্যান্স
Hashtable
অভ্যন্তরীণভাবে সিঙ্ক্রোনাইজ করা হিসাবে এটি এর থেকে Hashtable
কিছুটা ধীর হয়ে যায় HashMap
।
@দেখা
থ্রেডযুক্ত অ্যাপ্লিকেশনগুলির জন্য, আপনি প্রায়শই কনকন্টারহ্যাশম্যাপটি থেকে দূরে সরে যেতে পারেন- আপনার কর্মক্ষমতা প্রয়োজনীয়তার উপর নির্ভর করে।
1. Hashmap
এবং HashTable
উভয় স্টোর কী এবং মান।
2. Hashmap
হিসাবে একটি কী সংরক্ষণ করতে পারেন null
। Hashtable
সংরক্ষণ করতে পারবেন না null
।
3. HashMap
সিঙ্ক্রোনাইজ করা হয় না তবে Hashtable
সিঙ্ক্রোনাইজ করা হয়।
৪. HashMap
সাথে সিঙ্ক্রোনাইজ করা যায়Collection.SyncronizedMap(map)
Map hashmap = new HashMap();
Map map = Collections.SyncronizedMap(hashmap);
ইতিমধ্যে উল্লিখিত পার্থক্যগুলি ছাড়াও, এটি লক্ষ করা উচিত যে জাভা 8 এর পরে, HashMap
প্রতিটি বালতিতে ব্যবহৃত নোডগুলি (লিঙ্কযুক্ত তালিকার) পরিবর্তনশীলভাবে TreeNodes (লাল-কালো গাছ) দিয়ে প্রতিস্থাপন করা হয়েছে, যাতে উচ্চ হ্যাশের সংঘর্ষের উপস্থিতি থাকলেও, সবচেয়ে খারাপ পরিস্থিতি যখন সন্ধান করা হয়
ও (লগ (এন)) এর জন্য HashMap
ভিএস ও (এন) এর জন্য Hashtable
।
* উপরোক্ত উন্নতি প্রয়োগ করা যাবে না Hashtable
এখনো, কিন্তু শুধুমাত্র থেকে HashMap
, LinkedHashMap
এবং ConcurrentHashMap
।
এফওয়াইআই, বর্তমানে,
TREEIFY_THRESHOLD = 8
: যদি কোনও বালতিতে 8 টিরও বেশি নোড থাকে তবে লিঙ্কযুক্ত তালিকাকে ভারসাম্যযুক্ত গাছে রূপান্তরিত করা হয়।UNTREEIFY_THRESHOLD = 6
: যখন একটি বালতি খুব ছোট হয়ে যায় (অপসারণ বা পুনরায় আকার দেওয়ার কারণে) গাছটি লিঙ্কযুক্ত তালিকায় ফিরে রূপান্তরিত হয়।হ্যাশ টেবিল এবং হ্যাশম্যাপগুলির সাথে 5 টি মৌলিক পার্থক্য রয়েছে।
আমার ছোট অবদান:
প্রথম এবং এটির মধ্যে সবচেয়ে গুরুত্বপূর্ণ
Hashtable
এবংHashMap
এটিHashMap
থ্রেড-নিরাপদ নয় যখনHashtable
থ্রেড-নিরাপদ সংগ্রহ।পারফরম্যান্স
Hashtable
এবং এর মধ্যে দ্বিতীয় গুরুত্বপূর্ণ পার্থক্যটিHashMap
যেহেতুHashMap
সিঙ্ক্রোনাইজ করা হয় না এটির চেয়ে আরও ভাল পারফর্ম হয়Hashtable
।তৃতীয় পার্থক্য
Hashtable
বনামHashMap
যেHashtable
অপ্রচলিত বর্গ হয় এবং আপনি ব্যবহার করা উচিতConcurrentHashMap
স্থানেHashtable
জাভা।
হ্যাশম্যাপ: এটি java.util প্যাকেজের অভ্যন্তরে উপলব্ধ একটি শ্রেণী এবং এটি কী এবং মান বিন্যাসে উপাদান সংরক্ষণ করতে ব্যবহৃত হয়।
হ্যাশটেবল: এটি একটি উত্তরাধিকার শ্রেণি যা সংগ্রহের কাঠামোর ভিতরে স্বীকৃত।
হ্যাশ টেবিলটি জেডকে একটি উত্তরাধিকার শ্রেণি যা আর ব্যবহার করা উচিত নয়। এটির ব্যবহারগুলি সাম্প্রতিক হ্যাশম্যাপের সাথে প্রতিস্থাপন করুন । আপনার যদি থ্রেড সুরক্ষার প্রয়োজন না হয় তবে হ্যাশম্যাপ ব্যবহার করুন যা থ্রেডসফ নয় তবে দ্রুত এবং কম স্মৃতি ব্যবহার করে।
Hashtable
সিঙ্ক্রোনাইজ করা হয় যেখানে HashMap
না হয়।HashMap
ব্যর্থ-নিরাপদ, যখন Hashtable
না হয় তার জন্য গণক হয়। যদি আপনি পুনরাবৃত্তি করার সময় মানচিত্রটি পরিবর্তন করেন তবে আপনি জানতে পারবেন।HashMap
এতে নালাগুলির অনুমতি দেয়, যদিও Hashtable
হয় না।হ্যাশম্যাপ এবং হ্যাশ টেবিল
1) হ্যাশটেবল এবং হাশম্যাপ java.util.Map ইন্টারফেস প্রয়োগ করে 2) হাশম্যাপ এবং হ্যাশটেবল উভয়ই হ্যাশ ভিত্তিক সংগ্রহ। এবং হ্যাশিং উপর কাজ। সুতরাং এগুলি হ্যাশম্যাপ এবং হ্যাশ টেবিলের মিল।
1) প্রথম পার্থক্য হ্যাশম্যাপ থ্রেড নিরাপদ নয় যখন হ্যাশট্যাবল থ্রেডসেফ
2) হ্যাশম্যাপটি পারফরম্যান্স অনুযায়ী ভাল কারণ এটি থ্রেড নিরাপদ নয়। যদিও হ্যাশটেবল পারফরম্যান্স ওয়াইস ভাল না কারণ এটি থ্রেড নিরাপদ। সুতরাং একাধিক থ্রেড একই সাথে হ্যাশটেবল অ্যাক্সেস করতে পারে না।
Hashtable:
হ্যাশটেবল একটি ডেটা স্ট্রাকচার যা কী-মান জোড়ার মান ধরে রাখে। এটি কী এবং মান উভয়কেই বাতিল করতে দেয় না। NullPointerException
নাল মান যোগ করলে আপনি একটি পাবেন । এটি সিঙ্ক্রোনাইজ করা হয়। সুতরাং এটি তার ব্যয় সঙ্গে আসে। কেবলমাত্র একটি থ্রেড হ্যাশটবেলে অ্যাক্সেস করতে পারে নির্দিষ্ট সময়ে ।
উদাহরণ :
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 টি মূল পার্থক্য হ্যাশম্যাপ এবং হ্যাশটেবলের অন্তর্ভুক্ত
হ্যাশম্যাপ এবং হ্যাশটেবল উভয়ই java.util.Map ইন্টারফেস প্রয়োগ করে তবে কিছু পার্থক্য রয়েছে যা আরও কার্যকর কোড লিখতে জাভা বিকাশকারীদের অবশ্যই বুঝতে হবে। জাভা 2 প্ল্যাটফর্ম v1.2 হিসাবে, হ্যাশটেবল শ্রেণিটি জাভা সংগ্রহের ফ্রেমওয়ার্কের সদস্য হয়ে মানচিত্র ইন্টারফেস বাস্তবায়নের জন্য পুনরায় প্রবর্তিত হয়েছিল।
হ্যাশম্যাপ এবং হ্যাশটেবলের মধ্যে অন্যতম প্রধান পার্থক্য হ্যাশম্যাপটি অ-সিঙ্ক্রোনাইজড, হ্যাশটবাল সিঙ্ক্রোনাইজড, যার অর্থ হ্যাশটেবল থ্রেড-নিরাপদ এবং একাধিক থ্রেডের মধ্যে ভাগ করা যেতে পারে তবে হ্যাশম্যাপটি সঠিক সিঙ্ক্রোনাইজেশন ছাড়া একাধিক থ্রেডের মধ্যে ভাগ করা যায় না। জাভা 5 প্রবর্তন করেছে কনক্রেনর হ্যাশম্যাপ যা হ্যাশটেবলের বিকল্প এবং জাভাতে হ্যাশটেবলের চেয়ে আরও ভাল স্কেলাবিলিটি সরবরাহ করে yn সিঙ্ক্রোনাইজ করা মানে শুধুমাত্র একটি থ্রেড একটি সময়ে হ্যাশ টেবিলটি সংশোধন করতে পারে। মূলত, এর অর্থ হ্যাশটেবলে আপডেট করার আগে যে কোনও থ্রেডের জন্য অবজেক্টটিতে একটি লক অর্জন করতে হবে অন্যরা লকটি প্রকাশের জন্য অপেক্ষা করবে।
হ্যাশম্যাপ শ্রেণিটি হ্যাশটেবলের সমতুল্য, এটি নালার অনুমতি দেয় ব্যতীত। (হ্যাশম্যাপ কী এবং মান হিসাবে নাল মানকে মঞ্জুরি দেয় যেখানে হ্যাশটেবল নালগুলি মঞ্জুরি দেয় না)।
হ্যাশম্যাপ বনাম হ্যাশটেবলের মধ্যে তৃতীয় তাত্পর্যপূর্ণ পার্থক্য হ্যাশমে্যাপের ইলিট্রেটর একটি ব্যর্থ-দ্রুত পুনরুক্তিকারী এবং হ্যাশটেবলের জন্য গণক না থাকলে এবং যদি কোনও অন্য থ্রেড আইট্রেটরের নিজস্ব অপসারণ ব্যতীত কোনও উপাদান যুক্ত বা মুছে ম্যাপকে কাঠামোগত পরিবর্তন করে তবে (হ্যাশমে্যাপে আইট্রেটার একটি ব্যর্থ-দ্রুত পুনরুদ্ধারকারী) throw ) পদ্ধতি। তবে এটি কোনও গ্যারান্টিযুক্ত আচরণ নয় এবং জেভিএম সেরা চেষ্টা করে এটি করবে। এটি জাভাতে গণনা এবং আইট্রেটারের মধ্যেও একটি গুরুত্বপূর্ণ পার্থক্য।
হ্যাশটেবল এবং হ্যাশম্যাপের মধ্যে আরও একটি উল্লেখযোগ্য পার্থক্য হ'ল থ্রেড-সুরক্ষা এবং সিঙ্ক্রোনাইজেশনের কারণে হ্যাশটেবল একক থ্রেডযুক্ত পরিবেশে যদি হ্যাশম্যাপের তুলনায় অনেক ধীর হয়। সুতরাং আপনার যদি সিঙ্ক্রোনাইজেশন প্রয়োজন হয় না এবং হ্যাশম্যাপটি কেবল একটি থ্রেড দ্বারা ব্যবহৃত হয় তবে এটি জাভাতে হ্যাশটেবল সম্পাদন করে।
হ্যাশম্যাপ গ্যারান্টি দেয় না যে সময়ের সাথে মানচিত্রের ক্রম স্থির থাকবে।
দ্রষ্টব্য যে হাশম্যাপ দ্বারা সিঙ্ক্রোনাইজ করা যায়
Map m = Collections.synchronizedMap(hashMap);
সংক্ষেপে জাভাতে হ্যাশটেবল এবং হ্যাশম্যাপের মধ্যে উল্লেখযোগ্য পার্থক্য রয়েছে যেমন থ্রেড-সুরক্ষা এবং গতি এবং এর ভিত্তিতে কেবল হ্যাশটেবল ব্যবহার করুন যদি আপনার একেবারে থ্রেড-সুরক্ষা প্রয়োজন হয়, আপনি যদি জাভা 5 তে চালাচ্ছেন তবে জাভাতে সাম্প্রতিক হ্যাশম্যাপ ব্যবহারের বিষয়টি বিবেচনা করুন।
হ্যাশম্যাপ এবং হ্যাশটেবল উভয়ই কী এবং মান আকারে ডেটা সঞ্চয় করতে ব্যবহৃত হয়। উভয়ই অনন্য কীগুলি সংরক্ষণ করতে হ্যাশিং কৌশল ব্যবহার করছেন। হ্যাশম্যাপ এবং হ্যাশটেবল শ্রেণীর মধ্যে অনেকগুলি পার্থক্য রয়েছে যা নীচে দেওয়া হয়েছে।