হ্যাশম্যাপ এবং হ্যাশটেবলের মধ্যে পার্থক্য?


3749

জাভাতে a HashMapএবং a এর মধ্যে পার্থক্য কী Hashtable?

কোন থ্রেডযুক্ত অ্যাপ্লিকেশন জন্য আরও দক্ষ?


17
হ্যাশ টেবিল জাভা 1.7 এ অচল এবং এটি
কনকন্টের্যাপ ম্যাপ

@MissFiona না, ConcurrentMapহয় না প্রয়োজনীয় এখানে, যেমন প্রশ্ন বলে "অ থ্রেডেড অ্যাপ্লিকেশন" মানে থ্রেডিং / সম্পাতবিন্দু কোনো সমস্যা হয় না।
বেসিল Bourque

উত্তর:


3773

জাভা HashMapএবং এর Hashtableমধ্যে বিভিন্ন পার্থক্য রয়েছে :

  1. Hashtableহয় সিঙ্ক্রোনাইজ , যেহেতু HashMapনয়। এটি HashMapনন-থ্রেডযুক্ত অ্যাপ্লিকেশনগুলির জন্য আরও ভাল করে তোলে , কারণ আনইনক্রোনাইজ করা অবজেক্টগুলি সাধারণত সিঙ্ক্রোনাইজ করাগুলির চেয়ে ভাল সম্পাদন করে।

  2. Hashtablenullকী বা মানগুলির অনুমতি দেয় না । HashMapএকটি nullকী এবং যে কোনও nullমানকে অনুমতি দেয়।

  3. হ্যাশম্যাপের একটি সাবক্লাস হ'ল LinkedHashMap, সুতরাং আপনি যদি ভবিষ্যদ্বাণীযোগ্য পুনরাবৃত্তির ক্রমটি চান (যা ডিফল্টরূপে সন্নিবেশনের ক্রম) চায় তবে আপনি খুব সহজেই এটির HashMapজন্য একটি পরিবর্তন করতে পারবেন LinkedHashMap। আপনি যদি ব্যবহার করছিলেন তবে এটি এত সহজ হবে না Hashtable

যেহেতু সিঙ্ক্রোনাইজেশন আপনার পক্ষে সমস্যা নয়, তাই আমি প্রস্তাব দেব HashMap। যদি সিঙ্ক্রোনাইজেশন কোনও সমস্যা হয়ে যায় তবে আপনি এটিও দেখতে পারেন ConcurrentHashMap


84
আপনি যদি হ্যাশম্যাপ থ্রেড-নিরাপদ করতে চান তবে ব্যবহার করুন Collections.synchronizedMap()
রক স্ট্রিনিয়া

275
আমি আরও মন্তব্য করব যে থ্রেড-সুরক্ষার জন্য নিষ্পাপ দৃষ্টিভঙ্গি Hashtable("প্রতিটি পদ্ধতি সিঙ্ক্রোনাইজ করা যেকোন সংগত সমস্যার যত্ন নেওয়া উচিত!") থ্রেডযুক্ত অ্যাপ্লিকেশনগুলির জন্য এটি আরও খারাপ করে তোলে । আপনি বাহ্যিকভাবে একটি HashMap(এবং ফলাফলগুলি সম্পর্কে চিন্তাভাবনা) সিঙ্ক্রোনাইজ করা বা একটি ConcurrentMapবাস্তবায়ন (এবং সম্মতিতে এর প্রসারিত এপিআই ব্যবহার করে) ব্যবহার করা ভাল। নীচের লাইন: Hashtableযখন কোনও উত্তরাধিকার এপিআই (সিএ। 1996 থেকে) এর প্রয়োজন হয় কেবল তখনই ব্যবহার করার কারণ reason
এরিকসন

8
হ্যাশম্যাপ প্রোগ্রামারকে থ্রেডস্যাফ কোড লেখার জন্য নমনীয়তা দেয় যখন তারা আসলে এটি ব্যবহার করে। এটি খুব কমই ঘটেছে যে আমার কনডাক্টর হ্যাশম্যাপ বা হ্যাশ টেবিলের মতো একটি থ্রেড নিরাপদ সংগ্রহের প্রয়োজন ছিল। আমার যা প্রয়োজন তা হ'ল থ্রেডসেফ হওয়ার জন্য কয়েকটি নির্দিষ্ট ক্রিয়াকলাপ বা একটি সিঙ্ক্রোনাইজড ব্লকের নির্দিষ্ট বিবৃতি।
গৌরব আগরওয়াল

2
হ্যাশটেবল অপ্রচলিত এবং আমরা হ্যাশম্যাপটি নন থ্রেড নিরাপদ পরিবেশের জন্য ব্যবহার করছি। আপনার যদি থ্রেড সুরক্ষার প্রয়োজন হয় তবে আপনি কালেকশন.সিনক্রোনাইজড ম্যাপ () ব্যবহার করতে পারেন বা কনসেন্টারহ্যাশম্যাপ ব্যবহার করতে পারেন যা হ্যাশটেবলের চেয়ে আরও দক্ষ।
মানেশ কুমার

1
এটি অপ্রচলিত তবে অবহেলিত নয় এবং আমি ভাবছি কেন এটি। আমি অনুমান করছি যে এই শ্রেণিটি অপসারণ করা হয়েছে (এবং একই কারণে ভেক্টর) প্রচুর বিদ্যমান কোডটি ভেঙে দেবে এবং @ ডেপ্রেসিটেড দিয়ে মন্তব্য করা কোড সরিয়ে দেওয়ার অভিপ্রায় বোঝায়, যা সম্ভবত সেখানে নেই।
জিলিস ভ্যান গর্প

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
এছাড়াও মনে রাখবেন যে কোনও হ্যাশম্যাপ সংশোধিত হলে, এটির নির্দেশকারী পুনরাবৃত্তিগুলি অবৈধ রেন্ডার করা হয়।
ক্রিস কে

3
সুতরাং থ্রেডের ক্ষেত্রে সুরক্ষার ক্ষেত্রে সিঙ্ক্রোনাইজড (মাইম্যাপ) {... Con এবং কনকন্টারহ্যাশম্যাপের মধ্যে কোনও পার্থক্য রয়েছে কি?
টেলিবিগ

3
খুব সত্য, আমি এখানে এখানে একই ব্যাখ্যা করার চেষ্টা করেছি .. lovehasija.com/2012/08/16/…
প্রেম হাসিজা

@ ভূষণ: এটি সর্বোত্তম প্রচেষ্টা ভিত্তিতে ছুঁড়ে ফেলা হবে, এটি গ্যারান্টিযুক্ত আচরণ নয়: ডকস.অরাকলস
ম্যাট স্টিফেনসন

জেভিএম বিকাশের ক্রুটির বেশ কয়েক বছর ধরে থাকার পরে আমি বলতে পারি যে হ্যাশটবেলের অভ্যন্তরীণ সিঙ্ক্রোনাইজেশন গ্রাহকের কোডে সঠিকভাবে আঙুলটি সঠিকভাবে দেখানোর জন্য কার্যকর যখন তিনি ডজি কনটার্নেন্ট কোড লেখেন। আমরা হ্যাশম্যাপের ভিতরে ব্যর্থতার বেশ কয়েকটি অভিযোগ পেয়েছি (এবং "স্পষ্টতই" একটি জেডিকে / জেভিএম বাগ), যখন কারণটি যুগপত পরিবর্তন ছিল।
হট লিকস

363

Hashtableলিগ্যাসি কোড হিসাবে বিবেচিত হয়। এর Hashtableব্যবহার HashMapবা ডেরিভেশনগুলি নিয়ে কিছুই করা যায় না HashMap, সুতরাং নতুন কোডের জন্য, আমি ফিরে যাওয়ার কোনও যুক্তি দেখছি না Hashtable


101
হ্যাশটেবল জাভাডোক (জোর যুক্ত করা) থেকে: "জাভা 2 প্ল্যাটফর্মের ভি 1.2 হিসাবে, এই শ্রেণিটি মানচিত্র ইন্টারফেস বাস্তবায়নের জন্য পুনঃনির্মাণ করা হয়েছিল, এটি জাভা সংগ্রহ সংগ্রহ ফ্রেমের সদস্য হিসাবে তৈরি করেছে ।" তবে, আপনি ঠিক বলেছেন যে এটি লিগ্যাসি কোড। কালেকশন.সাইনক্রোনাইজড ম্যাপ (হ্যাশম্যাপ) এর সাথে সিঙ্ক্রোনাইজেশনের সমস্ত সুবিধা আরও দক্ষতার সাথে পাওয়া যায়। (ভেক্টর কালেকশন.সাইনক্রোনাইজডলিস্টের (অ্যারেলিস্ট) এর উত্তরাধিকার সংস্করণ হওয়ার অনুরূপ))
কিপ

15
@ অবারেন্ট ৮০: দুর্ভাগ্যক্রমে দুজনের মধ্যে আপনার কোনও পছন্দ নেই এবং জেএমএমের জন্য প্রোগ্রামিং করার সময় হ্যাশটেবল ব্যবহার করতে হবে ...
pwes

6
এই উত্তর মুছে ফেলা উচিত। এটিতে ভুল তথ্য রয়েছে এবং এতে প্রচুর পরিমাণে উদ্দীপনা রয়েছে।
anon58192932

@ anon58192932 প্রশ্ন ঠিক করার জন্য এটি সম্পাদনা করা সম্ভব?
GC_

1
আমাদের পতাকাঙ্কিত করে @ aberrant80 বা কোনও প্রশাসকের দৃষ্টি আকর্ষণ করতে হবে। পতাকাঙ্কণ সাহায্য করতে পারে - এটি এখন চেষ্টা করবে।
anon58192932

189

এই প্রশ্নটি প্রায়শই সাক্ষাত্কারে জিজ্ঞাসা করা হয় পরীক্ষার্থীরা সংগ্রহের ক্লাসগুলির সঠিক ব্যবহার বুঝতে পারে এবং বিকল্প সমাধানের বিষয়ে সচেতন কিনা তা খতিয়ে দেখার জন্য।

  1. HashMapবর্গ মোটামুটিভাবে সমতূল্য Hashtableছাড়া এটি নন সিঙ্ক্রোনাইজ পারমিট NULLs করা হয়। ( HashMapকী এবং মান হিসাবে নাল মানকে Hashtableঅনুমতি দেয় যেখানে এটির অনুমতি দেয় না null)
  2. HashMap মানচিত্রের ক্রমটি সময়ের সাথে স্থির থাকবে এমন কোনও গ্যারান্টি দেয় না।
  3. HashMapসিঙ্ক্রোনাইজ থাকা অবস্থায় অ Hashtableসিঙ্ক্রোনাইজড।
  4. এর মধ্যে শোধকটি HashMapব্যর্থ-নিরাপদ এবং অন্য কোনও থ্রেডের নিজস্ব পদ্ধতি ব্যতীত অন্য কোনও উপাদান যুক্ত বা মুছে ফেলার মাধ্যমে যদি মানচিত্রটি কাঠামোগতভাবে পরিবর্তন করে তবে Hashtableনিক্ষেপ করুন । তবে এটি কোনও গ্যারান্টিযুক্ত আচরণ নয় এবং জেভিএম সেরা চেষ্টা করে এটি করবে।ConcurrentModificationExceptionIteratorremove()

কিছু গুরুত্বপূর্ণ শর্তাদি নোট:

  1. সিঙ্ক্রোনাইজ করা মানে একটি মাত্র থ্রেড এক সময় হ্যাশ টেবিলটি পরিবর্তন করতে পারে। মূলত, এর অর্থ হ'ল একটি হালনাগাদ করার আগে যে কোনও থ্রেডকে Hashtableঅবজেক্টে একটি লক অর্জন করতে হবে অন্যরা লকটি প্রকাশের জন্য অপেক্ষা করবে।
  2. ব্যর্থ-নিরাপদ পুনরাবৃত্তির প্রসঙ্গে প্রাসঙ্গিক। যদি সংগ্রহের অবজেক্টে একটি ইটারেটর তৈরি করা হয়ে থাকে এবং অন্য কিছু থ্রেড "অবকাঠামোগতভাবে" সংগ্রহ অবজেক্টটি সংশোধন করার চেষ্টা করে, তখন একযোগে পরিবর্তন ব্যতিক্রম নিক্ষেপ করা হবে। অন্যান্য থ্রেডগুলির পক্ষে setপদ্ধতিটি আহ্বান করা সম্ভব যদিও এটি "কাঠামোগতভাবে" সংগ্রহটি সংশোধন করে না। তবে, কল করার আগে set, সংগ্রহটি কাঠামোগতভাবে পরিবর্তন করা হয়েছে, IllegalArgumentExceptionনিক্ষেপ করা হবে।
  3. কাঠামোগতভাবে সংশোধন করার অর্থ হ'ল উপাদান মোছা বা সন্নিবেশ করা যা মানচিত্রের কাঠামোকে কার্যকরভাবে পরিবর্তন করতে পারে।

HashMap দ্বারা সিঙ্ক্রোনাইজ করা যায়

Map m = Collections.synchronizeMap(hashMap);

মানচিত্র গণনা অবজেক্টগুলির মাধ্যমে পুনরাবৃত্তির জন্য সরাসরি সহায়তার পরিবর্তে সংগ্রহের ভিউ সরবরাহ করে। সংগ্রহের দর্শনগুলি এই বিভাগে পরে আলোচনা করা হয়েছে, ইন্টারফেসের ভাবগাম্ভীর্যতা ব্যাপকভাবে বৃদ্ধি করে। মানচিত্র আপনাকে কী, মান বা কী-মান জোড়ায় পুনরাবৃত্তি করতে দেয়; Hashtableতৃতীয় বিকল্প সরবরাহ করে না। মানচিত্র পুনরাবৃত্তির মাঝে প্রবেশগুলি সরানোর একটি নিরাপদ উপায় সরবরাহ করে; Hashtableনা। অবশেষে, মানচিত্র Hashtableইন্টারফেসে একটি সামান্য ঘাটতি পূরণ করে । Hashtableরয়েছে বলে একটি পদ্ধতি রয়েছে যা Hashtableএকটি প্রদত্ত মান থাকে তবে এটি সত্য করে । এর নাম দেওয়া, আপনি যদি এই Hashtableপ্রদত্ত কীটি ধারণ করে তবে এই পদ্ধতিটি সত্য হয়ে উঠবে বলে আপনি আশা করতে পারেন , কারণ কীটি এটির জন্য প্রাথমিক অ্যাক্সেস প্রক্রিয়া Hashtable। মানচিত্র ইন্টারফেস পদ্ধতিটির নাম পরিবর্তন করে বিভ্রান্তির এই উত্সকে সরিয়ে দেয় containsValue। এছাড়াও, এটি ইন্টারফেসের সামঞ্জস্য - containsValueসমান্তরাল উন্নতি করে containsKey

মানচিত্র ইন্টারফেস


19
এই উত্তরে কমপক্ষে 2 টি গুরুত্বপূর্ণ ত্রুটিযুক্ত ভুল রয়েছে। এটি অবশ্যই এই অনেকগুলি উপার্জনের প্রাপ্য নয়।
স্টিফেন সি

58
1) হ্যাশম্যাপের পুনরাবৃত্তি ব্যর্থ-নিরাপদ নয়। তারা ব্যর্থ দ্রুত। এই দুটি পদগুলির মধ্যে অর্থের মধ্যে একটি বিশাল পার্থক্য রয়েছে। 2) এ- setতে কোনও অপারেশন নেই HashMap। 3) পূর্ববর্তী পরিবর্তন থাকলে put(...)অপারেশনটি নিক্ষেপ করবে না IllegalArgumentException। 4) এর ব্যর্থ-ফাস্ট আচরণ HashMap এছাড়াও ঘটে যদি আপনি একটি ম্যাপিং পরিবর্তন করুন। 5) ব্যর্থ-ফাস্ট আচরণ করা হয় নিশ্চিত। (গ্যারান্টিযুক্ত নয় এমনটি হ'ল HashTableযদি আপনি একযোগে সংশোধন করে থাকেন তবে তার আচরণ actual আসল আচরণটি হ'ল ... অনুমানযোগ্য))
স্টিফেন সি

25
)) Hashtableগ্যারান্টি দেয় না যে মানচিত্রের উপাদানগুলির ক্রমও সময়ের সাথে স্থিতিশীল থাকবে। (আপনি সম্ভবত বিভ্রান্তিকর হয় Hashtableসঙ্গে LinkedHashMap।)
স্টিফেন সি

4
অন্য কেউ সত্যিই উদ্বিগ্ন যে শিক্ষার্থীরা এই দিনগুলিতে সংগ্রহের "সিঙ্ক্রোনাইজড সংস্করণ" পাওয়ার একরকম ভুল ধারণা পেয়েছে যে আপনাকে বাহ্যিকভাবে যৌগিক ক্রিয়াকলাপগুলি সমন্বয় করতে হবে না? এটির আমার প্রিয় উদাহরণ thing.set(thing.get() + 1);যা প্রায়শই অবাক হয়ে নবজাতককে পুরোপুরি অরক্ষিত হিসাবে ধরা দেয় না, বিশেষত যদি get()এবং set()সিঙ্ক্রোনাইজড পদ্ধতিগুলি হয়। তাদের অনেকেই যাদু আশা করছেন।

হাশম্যাপে ইট্রেটাররা ব্যর্থ-নিরাপদ নয়
আব্দুল

130

HashMap: Mapইন্টারফেসটির একটি বাস্তবায়ন যা কোনও অ্যারে সূচক করতে হ্যাশ কোড ব্যবহার করে। Hashtable: হাই, 1998 ডেকেছে। তারা তাদের সংগ্রহগুলি এপিআই ফিরে চায়।

গুরুতরভাবে যদিও, আপনি Hashtableপুরোপুরি দূরে থাকাই ভাল । একক থ্রেডযুক্ত অ্যাপ্লিকেশনগুলির জন্য আপনার সিঙ্ক্রোনাইজেশনের অতিরিক্ত ওভারহেডের প্রয়োজন নেই। উচ্চতর যুগপত অ্যাপ্লিকেশনগুলির জন্য, ভৌতিক সিঙ্ক্রোনাইজেশন অনাহারী, অচলাবস্থা বা অপ্রয়োজনীয় আবর্জনা সংগ্রহ বিরতিতে পারে। টিম হাওল্যান্ড যেমন উল্লেখ করেছে, আপনি এর ConcurrentHashMapপরিবর্তে ব্যবহার করতে পারেন ।


এটি আসলে জ্ঞান করে। একযোগে হ্যাশম্যাপস আপনাকে সিঙ্ক্রোনাইজেশনের স্বাধীনতা দেয় এবং ডিবাগিং আরও সহজ।
prap19

1
এটি জাভা বা সমস্ত হ্যাশ মানচিত্র প্রয়োগের জন্য নির্দিষ্ট।

125

মনে রাখবেন যে HashTableজাভা কালেকশন ফ্রেমওয়ার্ক (জেসিএফ) প্রবর্তনের আগে লিগ্যাসি ক্লাস ছিল এবং পরে Mapইন্টারফেসটি প্রয়োগের জন্য এটি পুনরায় প্রেরণ করা হয়েছিল । তাই ছিল Vectorএবং Stack

সুতরাং, নতুন কোডে সর্বদা তাদের থেকে দূরে থাকুন, কারণ অন্যরা যেমন নির্দেশ করেছেন , জেসিএফ-তে সবসময় আরও ভাল বিকল্প রয়েছে

এখানে জাভা সংগ্রহের প্রতারণা শীটটি আপনাকে দরকারী মনে করবে। খেয়াল করুন ধূসর ব্লকটিতে উত্তরাধিকার শ্রেণি হ্যাশটবেল, ভেক্টর এবং স্ট্যাক রয়েছে।

এখানে চিত্র বর্ণনা লিখুন


72

ইতিমধ্যে পোস্ট অনেক ভাল উত্তর আছে। আমি কয়েকটি নতুন পয়েন্ট যুক্ত করছি এবং এর সংক্ষিপ্তসার করছি।

HashMapএবং Hashtableউভয়ই কী এবং মান আকারে ডেটা সঞ্চয় করতে ব্যবহৃত হয় । উভয়ই অনন্য কীগুলি সংরক্ষণ করতে হ্যাশিং কৌশল ব্যবহার করছেন। তবে হ্যাশম্যাপ এবং হ্যাশটেবল শ্রেণীর মধ্যে অনেকগুলি পার্থক্য রয়েছে যা নীচে দেওয়া হয়েছে।

হ্যাশ মানচিত্র

  1. HashMapঅ সিঙ্ক্রোনাইজড। এটি থ্রেড নিরাপদ নয় এবং যথাযথ সিঙ্ক্রোনাইজেশন কোড ব্যতীত অনেক থ্রেডের মধ্যে ভাগ করা যায় না।
  2. HashMap একটি নাল কী এবং একাধিক নাল মানকে অনুমতি দেয়।
  3. HashMap জেডিকে ১.২ এ প্রবর্তিত একটি নতুন শ্রেণি।
  4. HashMap দ্রুত.
  5. HashMapএই কোডটি কল করে আমরা এটিকে সিঙ্ক্রোনাইজ করতে পারি
    Map m = Collections.synchronizedMap(HashMap);
  6. HashMap Iterator দ্বারা অনুসরণ করা হয়।
  7. আইট্রেটার ইন HashMapব্যর্থ - দ্রুত।
  8. HashMap অ্যাবস্ট্রাকম্যাপ ক্লাস উত্তরাধিকারসূত্রে প্রাপ্ত।

হ্যাশ টেবিল

  1. Hashtableসিঙ্ক্রোনাইজ করা হয়। এটি থ্রেড-নিরাপদ এবং অনেক থ্রেডের সাথে ভাগ করা যায়।
  2. Hashtable কোনও নাল কী বা মানকে অনুমতি দেয় না।
  3. Hashtable একটি উত্তরাধিকার শ্রেণি।
  4. Hashtable ধীর.
  5. Hashtable অভ্যন্তরীণভাবে সিঙ্ক্রোনাইজড এবং সিঙ্ক-সিঙ্ক করা যাবে না।
  6. Hashtable গণক এবং Iterator দ্বারা অনুসরণ করা হয়।
  7. ইন-এমুনরেটর Hashtableব্যর্থ-দ্রুত নয়।
  8. Hashtable অভিধান ক্লাস উত্তরাধিকারসূত্রে প্রাপ্ত।

আরও পঠন জাভায় হ্যাশম্যাপ এবং হ্যাশটেবলের মধ্যে পার্থক্য কী?

এখানে চিত্র বর্ণনা লিখুন


প্রায় কাছাকাছি এই উত্তর মধ্যে আবৃত (এর dupicate) - stackoverflow.com/a/39785829/432903
13:37

আপনি কেন বলছেন ~ " হ্যাশটেবল একটি উত্তরাধিকার শ্রেণি "? যেখানে এর জন্য সহায়ক ডকুমেন্টেশন।
ইগোরগানাপলস্কি

2
- আপনি এই পড়তে পারে @IgorGanapolsky stackoverflow.com/questions/21086307/...
roottraveller

হ্যাশম্যাপ বজায় রাখা ট্রি ম্যাপের চেয়ে ব্যয়বহুল। কারণ হ্যাশম্যাপ অপ্রয়োজনীয় অতিরিক্ত বালতি তৈরি করে।
আব্দুল

64

Izb যা বলেছিল তা ছাড়াও HashMapনাল মানকে মঞ্জুরি দেয়, যেখানে Hashtableহয় না।

এছাড়াও লক্ষ করুন যে জাভাডোকস রাজ্য হিসাবে অবিচ্ছিন্ন এবং ইন্টারফেস দ্বারা প্রতিস্থাপন করা হয়েছে , যা শ্রেণি Hashtableপ্রসারিত করে ।DictionaryMap


3
কিন্তু এটি হ্যাশটবেলকে অচল করে দেয় না?
পেসারিয়ার

@ পেসারিয়ার হ্যাশ টেবিল জাভা 1.7 থেকে অপ্রচলিত।
মাজিদ আলী খান

62

এই চার্টটি একবার দেখুন। এটি HashMapএবং পাশাপাশি বিভিন্ন ডেটা স্ট্রাকচারের মধ্যে তুলনা সরবরাহ করে Hashtable। তুলনাটি নির্ভুল, স্পষ্ট এবং সহজে বোঝা যায়।

জাভা সংগ্রহ ম্যাট্রিক্স


49

Hashtableঅনুরূপ HashMapএবং একই ইন্টারফেস আছে। পদ্ধতিগুলি HashMapসিঙ্ক্রোনাইজ হওয়ার কারণে আপনার যদি উত্তরাধিকার অ্যাপ্লিকেশনগুলির জন্য সমর্থন প্রয়োজন না হয় বা আপনার সিঙ্ক্রোনাইজেশন প্রয়োজন হয় না তবে আপনি ব্যবহার Hashtablesকরার পরামর্শ দেওয়া হয়। সুতরাং আপনার ক্ষেত্রে যেমন আপনি মাল্টি-থ্রেডিং নয়, HashMapsতবে আপনার সেরা বাজি।


36

হ্যাশটেবল এবং হ্যাশম্যাপের মধ্যে আরেকটি মূল পার্থক্য হ্যাশমে্যাপে ইলিট্রেটার ব্যর্থ-দ্রুত এবং হ্যাশট্যাবলের জন্য গণক না থাকলে এবং যদি কোনও অন্য থ্রেড আইট্রেটরের নিজস্ব অপসারণ () পদ্ধতি ব্যতীত কোনও উপাদান যুক্ত বা মুছে কাঠামোগতভাবে মানচিত্রটি পরিবর্তন করে। তবে এটি কোনও গ্যারান্টিযুক্ত আচরণ নয় এবং জেভিএম সর্বাত্মক প্রচেষ্টায় এটি করবে।

আমার উত্স: http://javarevisited.blogspot.com/2010/10/differences-between-hashmap-and.html


36

ইতিমধ্যে এখানে বর্ণিত অন্যান্য সমস্ত গুরুত্বপূর্ণ দিকের পাশাপাশি, জাভা স্পেসে "সর্বশেষ এবং সর্বশ্রেষ্ঠ" সংযোজন অনুসারে কালেকশন এপিআই (যেমন মানচিত্র ইন্টারফেস) সর্বদা সংশোধন করা হচ্ছে।

উদাহরণস্বরূপ, জাভা 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 এ অবতরণ করবে না ... :(

প্রকল্প মুদ্রার সংগ্রহের বর্ধনগুলি কী জেডিকে 8 এ চলেছে?


34

Hashtableসিঙ্ক্রোনাইজ করা হয়েছে, যদিও HashMapনেই। যে Hashtableতুলনায় ধীর করে তোলে Hashmap

থ্রেডযুক্ত অ্যাপ্লিকেশনগুলির জন্য, HashMapযেহেতু কার্যকারিতা হিসাবে তারা অন্যথায় একই রকম ব্যবহার করুন।


30
  • হ্যাশ টেবিলটি সিঙ্ক্রোনাইজ করা হয়েছে, আপনি যদি এটি একটি একক থ্রেডে ব্যবহার করেন তবে আপনি হ্যাশম্যাপ ব্যবহার করতে পারেন , এটি একটি সিনক্রোনাইজ করা সংস্করণ। আনসিঙ্ক্রোনাইজ করা অবজেক্টগুলি প্রায়শই একটু বেশি পারফরম্যান্ট হয়। উপায় দ্বারা যদি একাধিক থ্রেড একই সাথে একটি হ্যাশম্যাপ অ্যাক্সেস করে এবং কমপক্ষে একটি থ্রেড মানচিত্রকে কাঠামোগত পরিবর্তন করে তবে অবশ্যই এটি বাহ্যিকভাবে সিঙ্ক্রোনাইজ করা উচিত। ইউন ব্যবহার করে একটি সিঙ্ক্রোনাইজড মানচিত্রে একটি অযৌক্তিক মানচিত্রটি মোড়তে পারেন:

    Map m = Collections.synchronizedMap(new HashMap(...));
  • হ্যাশ টেবিলটিতে কেবল একটি কী বা মান হিসাবে নন-নাল অবজেক্ট থাকতে পারে। হ্যাশম্যাপে একটি নাল কী এবং নাল মান থাকতে পারে।

  • মানচিত্রে ফিরে আসা পুনরাবৃত্তকারীগুলি ব্যর্থ-দ্রুত হয়, যদি মানচিত্রটি পুনরুক্তি তৈরির পরে যেকোন সময় কাঠামোগতভাবে সংশোধন করা হয় তবে পুনরাবৃত্তির নিজস্ব অপসারণের পদ্ধতিটি বাদ দিয়ে পুনরুক্তিটি একটি নিক্ষেপ করবে ConcurrentModificationException। সুতরাং, একযোগে পরিবর্তনের মুখে, পুনরুক্তিকারী ভবিষ্যতে একটি নির্ধারিত সময়ে স্বেচ্ছাসেবক, অ-সংজ্ঞাবহ আচরণের ঝুঁকির চেয়ে দ্রুত এবং পরিষ্কার ব্যর্থ হয়। যেখানে Enumerations hashtable এর কী ও উপাদান পদ্ধতি দ্বারা ফিরে ব্যর্থ-ফাস্ট নয়।

  • হ্যাশ টেবিল এবং হ্যাশম্যাপ জাভা সংগ্রহ ফ্রেমওয়ার্কের সদস্য (জাভা 2 প্ল্যাটফর্ম v1.2, যেহেতু হ্যাশ টেবিলটি মানচিত্র ইন্টারফেসটি প্রয়োগ করতে পুনরায় প্রেরণ করা হয়েছিল)।

  • Hashtable উত্তরাধিকার কোড, ব্যবহার করতে ডকুমেন্টেশন পরামর্শ বিবেচনা করা হয় ConcurrentHashMap hashtable স্থানে যদি একটি থ্রেড-নিরাপদ অত্যন্ত সমবর্তী বাস্তবায়ন আকাঙ্ক্ষিত হয়।

  • হ্যাশম্যাপ আদেশগুলিতে যে উপাদানগুলিতে ফিরে আসে তার গ্যারান্টি দেয় না। হ্যাশ টেবিলের জন্য আমি অনুমান করি যে এটি একই রকম তবে আমি সম্পূর্ণ নিশ্চিত নই, আমি কোনও রিসোর্স পাই না যা স্পষ্টভাবে জানিয়েছে state


30

HashMapএবং Hashtableপাশাপাশি উল্লেখযোগ্য অ্যালগোরিদমিক পার্থক্য রয়েছে। এর আগে কেউ এটি উল্লেখ করেনি তাই আমি এটিকে সামনে আনছি। HashMapদুটি আকারের শক্তির সাথে একটি হ্যাশ টেবিল তৈরি করবে, এটি গতিশীলরূপে বাড়িয়ে দেবে যে আপনার কোনও বালতিতে প্রায় আটটি উপাদান (সংঘর্ষ) রয়েছে এবং সাধারণ উপাদান ধরণের জন্য উপাদানগুলি খুব ভালভাবে আলোড়িত করবে। তবে, Hashtableবাস্তবায়ন হ্যাশিংয়ের উপর আরও ভাল এবং সূক্ষ্ম নিয়ন্ত্রণ সরবরাহ করে যদি আপনি জানেন যে আপনি কী করছেন, যেমন আপনি টেবিলের আকারটি ব্যবহার করে উদাহরণস্বরূপ আপনার মানগুলির ডোমেন আকারের নিকটতম প্রাইম সংখ্যাটি ব্যবহার করতে পারেন এবং এর ফলে হাশম্যাপের চেয়ে কম পারস্পরিক সংঘর্ষের তুলনায় আরও ভাল পারফরম্যান্স হবে কিছু ক্ষেত্রে।

এই প্রশ্নে ব্যাপকভাবে আলোচিত স্পষ্ট পার্থক্যগুলি থেকে পৃথক করুন, আমি হ্যাশটবেলটিকে একটি "ম্যানুয়াল ড্রাইভ" গাড়ি হিসাবে দেখছি যেখানে হ্যাশিংয়ের উপর আপনার আরও ভাল নিয়ন্ত্রণ রয়েছে এবং হ্যাশম্যাপকে "স্বয়ংক্রিয় ড্রাইভ" পাল্টা হিসাবে দেখা যায় যা সাধারণত ভাল সম্পাদন করবে।


27

এখানে তথ্যের ভিত্তিতে , আমি হ্যাশম্যাপের সাথে যাওয়ার পরামর্শ দিই। আমি মনে করি সবচেয়ে বড় সুবিধাটি হ'ল জাভা আপনাকে এটির পরিবর্তন থেকে বিরত রাখবে আপনি যখন এটির পুনরাবৃত্তি করতে না পারেন, যদি না আপনি পুনরায় এটির মাধ্যমে এটি করেন।


5
এটি আসলে এটি প্রতিরোধ করে না, এটি কেবল এটি সনাক্ত করে এবং একটি ত্রুটি ছুঁড়ে।
বার্ট ভ্যান হিউকেলোম

1
আমি পুরোপুরি নিশ্চিত যে অন্তর্নিহিত সংগ্রহটি সংশোধন করার আগে এটি একটি সমকালীন মডিডিফিকেশনটি ছুঁড়ে ফেলবে, যদিও আমি ভুল হতে পারি।
46-

এটি সমবর্তী পরিবর্তনটি সনাক্ত করতে এবং একটি ব্যতিক্রম ছুঁড়ে ফেলার চেষ্টা করবে । তবে আপনি যদি থ্রেড দিয়ে কিছু করছেন তবে এটি কোনও প্রতিশ্রুতি দিতে পারে না। একেবারে ভাঙ্গন সহ কিছু হতে পারে ।
সিএইচও

24

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

« প্রাথমিক ক্ষমতা এবং লোড ফ্যাক্টর

ক্ষমতা হ্যাশ টেবিলের বালতি সংখ্যা, এবং প্রাথমিক ক্ষমতা কেবল হ্যাশ টেবিল তৈরি করার সময় ক্ষমতা হয়। নোট করুন যে হ্যাশ টেবিলটি উন্মুক্ত: " hashcollision" " " ক্ষেত্রে , একটি একক বালতি একাধিক এন্ট্রি সঞ্চয় করে, যা অবশ্যই ক্রমানুসারে অনুসন্ধান করা উচিত। লোড ফ্যাক্টর একটি পরিমাপ যা হ্যাশ টেবিলটি তার ক্ষমতা স্বয়ংক্রিয়ভাবে বৃদ্ধির আগে কীভাবে পূর্ণ হতে পারে।

হ্যাশম্যাপ ডিফল্ট প্রাথমিক ক্ষমতা (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


@দেখা


18

থ্রেডযুক্ত অ্যাপ্লিকেশনগুলির জন্য, আপনি প্রায়শই কনকন্টারহ্যাশম্যাপটি থেকে দূরে সরে যেতে পারেন- আপনার কর্মক্ষমতা প্রয়োজনীয়তার উপর নির্ভর করে।


17

1. Hashmapএবং HashTableউভয় স্টোর কী এবং মান।

2. Hashmapহিসাবে একটি কী সংরক্ষণ করতে পারেন nullHashtableসংরক্ষণ করতে পারবেন না null

3. HashMapসিঙ্ক্রোনাইজ করা হয় না তবে Hashtableসিঙ্ক্রোনাইজ করা হয়।

৪. HashMapসাথে সিঙ্ক্রোনাইজ করা যায়Collection.SyncronizedMap(map)

Map hashmap = new HashMap();

Map map = Collections.SyncronizedMap(hashmap);

16

ইতিমধ্যে উল্লিখিত পার্থক্যগুলি ছাড়াও, এটি লক্ষ করা উচিত যে জাভা 8 এর পরে, HashMapপ্রতিটি বালতিতে ব্যবহৃত নোডগুলি (লিঙ্কযুক্ত তালিকার) পরিবর্তনশীলভাবে TreeNodes (লাল-কালো গাছ) দিয়ে প্রতিস্থাপন করা হয়েছে, যাতে উচ্চ হ্যাশের সংঘর্ষের উপস্থিতি থাকলেও, সবচেয়ে খারাপ পরিস্থিতি যখন সন্ধান করা হয়

ও (লগ (এন)) এর জন্য HashMap ভিএস ও (এন) এর জন্য Hashtable

* উপরোক্ত উন্নতি প্রয়োগ করা যাবে না Hashtableএখনো, কিন্তু শুধুমাত্র থেকে HashMap, LinkedHashMapএবং ConcurrentHashMap

এফওয়াইআই, বর্তমানে,

  • TREEIFY_THRESHOLD = 8 : যদি কোনও বালতিতে 8 টিরও বেশি নোড থাকে তবে লিঙ্কযুক্ত তালিকাকে ভারসাম্যযুক্ত গাছে রূপান্তরিত করা হয়।
  • UNTREEIFY_THRESHOLD = 6 : যখন একটি বালতি খুব ছোট হয়ে যায় (অপসারণ বা পুনরায় আকার দেওয়ার কারণে) গাছটি লিঙ্কযুক্ত তালিকায় ফিরে রূপান্তরিত হয়।

14

হ্যাশ টেবিল এবং হ্যাশম্যাপগুলির সাথে 5 টি মৌলিক পার্থক্য রয়েছে।

  1. মানচিত্রগুলি আপনাকে কীগুলি, মানগুলি এবং উভয় কী-মান জোড়াও পুনরাবৃত্তি করতে এবং পুনরুদ্ধার করতে দেয়, যেখানে হ্যাশ টেবিলের এই সমস্ত ক্ষমতা নেই।
  2. হ্যাশটেবলে একটি ফাংশন রয়েছে (), যা ব্যবহার করা খুব বিভ্রান্তিকর। কারণগুলির অর্থটি কিছুটা বিচলিত। এর অর্থ কী রয়েছে বা এতে মান রয়েছে কিনা? বোঝা শক্ত। মানচিত্রে একই জিনিস আমাদের কনটেনসকে () এবং কনটেনসভ্যালু () ফাংশন রয়েছে যা বুঝতে খুব সহজ।
  3. হ্যাশম্যাপে আপনি পুনরাবৃত্তি করার সময় নিরাপদে নিরাপদে উপাদান সরিয়ে ফেলতে পারেন। যেখানে এটি হ্যাশ টেবিলগুলিতে সম্ভব নয়।
  4. হ্যাশ টেবিলগুলি ডিফল্টরূপে সিঙ্ক্রোনাইজ হয়, সুতরাং এটি একাধিক থ্রেড সহ সহজেই ব্যবহার করা যায়। যেখানে হ্যাশম্যাপগুলি ডিফল্টরূপে সিঙ্ক্রোনাইজ হয় না, তাই কেবলমাত্র একক থ্রেডের সাহায্যে ব্যবহার করা যায়। তবে আপনি এখনও সংগ্রহ ব্যবহারের শ্রেণীর সিঙ্ক্রোনাইজড ম্যাপ (মানচিত্র এম) ফাংশনটি ব্যবহার করে হ্যাশম্যাপকে সিঙ্ক্রোনাইজে রূপান্তর করতে পারেন।
  5. হ্যাশ টেবিল নাল কী বা নাল মানকে অনুমতি দেবে না। যেখানে হাশম্যাপ হিসাবে একটি নাল কী এবং একাধিক নাল মানকে অনুমতি দেয়।

13

আমার ছোট অবদান:

  1. প্রথম এবং এটির মধ্যে সবচেয়ে গুরুত্বপূর্ণ Hashtableএবং HashMapএটি HashMapথ্রেড-নিরাপদ নয় যখন Hashtableথ্রেড-নিরাপদ সংগ্রহ।

  2. পারফরম্যান্স Hashtableএবং এর মধ্যে দ্বিতীয় গুরুত্বপূর্ণ পার্থক্যটি HashMapযেহেতু HashMapসিঙ্ক্রোনাইজ করা হয় না এটির চেয়ে আরও ভাল পারফর্ম হয় Hashtable

  3. তৃতীয় পার্থক্য Hashtableবনাম HashMapযে Hashtableঅপ্রচলিত বর্গ হয় এবং আপনি ব্যবহার করা উচিত ConcurrentHashMapস্থানে Hashtableজাভা।


11

হ্যাশম্যাপ: এটি java.util প্যাকেজের অভ্যন্তরে উপলব্ধ একটি শ্রেণী এবং এটি কী এবং মান বিন্যাসে উপাদান সংরক্ষণ করতে ব্যবহৃত হয়।

হ্যাশটেবল: এটি একটি উত্তরাধিকার শ্রেণি যা সংগ্রহের কাঠামোর ভিতরে স্বীকৃত।


যদি এটি হয় তবে তা মন্তব্য হিসাবে থাকা উচিত উত্তর হিসাবে নয়।
মানিকান্ত গৌতম

10

হ্যাশ টেবিলটি জেডকে একটি উত্তরাধিকার শ্রেণি যা আর ব্যবহার করা উচিত নয়। এটির ব্যবহারগুলি সাম্প্রতিক হ্যাশম্যাপের সাথে প্রতিস্থাপন করুন । আপনার যদি থ্রেড সুরক্ষার প্রয়োজন না হয় তবে হ্যাশম্যাপ ব্যবহার করুন যা থ্রেডসফ নয় তবে দ্রুত এবং কম স্মৃতি ব্যবহার করে।


কারণ আমি ভেবেছিলাম অন্যান্য উত্তরগুলি হ্যাশ টেবিলকে বরখাস্ত করবে না তবে ব্যাখ্যা করেছে যে এটি থ্রেডসেফ। সত্যটি হ'ল আপনি কোডটিতে হ্যাশটবেলটি দেখার সাথে সাথে আপনার এটি কোনও বিট এড়িয়ে চলা না করে কনকন্টেনার হ্যাশম্যাপের সাথে প্রতিস্থাপন করা উচিত। এবং যদি থ্রেড সুরক্ষা কোনও উদ্বেগ না হয় তবে হ্যাশম্যাপটি কিছুটা পারফরম্যান্স উন্নত করতে ব্যবহার করা যেতে পারে।
jontejj

10
  1. Hashtableসিঙ্ক্রোনাইজ করা হয় যেখানে HashMapনা হয়।
  2. আর একটি পার্থক্য হ'ল এটির পুনরাবৃত্তি HashMapব্যর্থ-নিরাপদ, যখন Hashtableনা হয় তার জন্য গণক হয়। যদি আপনি পুনরাবৃত্তি করার সময় মানচিত্রটি পরিবর্তন করেন তবে আপনি জানতে পারবেন।
  3. HashMapএতে নালাগুলির অনুমতি দেয়, যদিও Hashtableহয় না।

3
হ্যাশম্যাপ পুনরুক্তি ব্যর্থ-দ্রুত ব্যর্থ-নিরাপদ নয়। আমাদের কেন সমকালীন হ্যাশম্যাপ রয়েছে যা পুনরাবৃত্তির সময় পরিবর্তনের অনুমতি দেয় ts এই পোস্ট জার্নালদেভ
পঙ্কজ

9

হ্যাশম্যাপ এবং হ্যাশ টেবিল

  • হ্যাশম্যাপ এবং হ্যাশ টেবিল সম্পর্কে কয়েকটি গুরুত্বপূর্ণ বিষয়। দয়া করে নীচে বিশদটি পড়ুন।

1) হ্যাশটেবল এবং হাশম্যাপ java.util.Map ইন্টারফেস প্রয়োগ করে 2) হাশম্যাপ এবং হ্যাশটেবল উভয়ই হ্যাশ ভিত্তিক সংগ্রহ। এবং হ্যাশিং উপর কাজ। সুতরাং এগুলি হ্যাশম্যাপ এবং হ্যাশ টেবিলের মিল।

  • হ্যাশম্যাপ এবং হ্যাশ টেবিলের মধ্যে পার্থক্য কী?

1) প্রথম পার্থক্য হ্যাশম্যাপ থ্রেড নিরাপদ নয় যখন হ্যাশট্যাবল থ্রেডসেফ
2) হ্যাশম্যাপটি পারফরম্যান্স অনুযায়ী ভাল কারণ এটি থ্রেড নিরাপদ নয়। যদিও হ্যাশটেবল পারফরম্যান্স ওয়াইস ভাল না কারণ এটি থ্রেড নিরাপদ। সুতরাং একাধিক থ্রেড একই সাথে হ্যাশটেবল অ্যাক্সেস করতে পারে না।


2
ডাউন-ভোট দেওয়া হয়েছে কারণ কিছু দিক থেকে এই উত্তরটি সঠিক নয়। হ্যাশটেবল মানচিত্র ইন্টারফেস বাস্তবায়ন করে না, তবে কেবল অভিধান ক্লাসটি প্রসারিত করে, যা অপ্রচলিত।
ইয়ান্নিস সেরমেটজিয়াডিস

8

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

    }
}

5

HashMapঅনুকরণ করা হয় এবং তাই নেই GWT client codeযেখানে ব্যবহারযোগ্য Hashtable


এটি কি দুটি এপিএসের মধ্যে পার্থক্যের একটি বিস্তৃত বর্ণনা?
ইগোরগানাপলস্কি

হ্যাঁ (sic!)। এটি সমস্ত জিডব্লিউটি বিকাশকারীদের এটি সম্পর্কে জানা উচিত।
পং

5

পুরানো এবং ক্লাসিক বিষয়, কেবল এই সহায়ক ব্লগটি যুক্ত করতে চান যা এটি ব্যাখ্যা করে:

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

মনীষ ছাব্রা ব্লগ

5 টি মূল পার্থক্য হ্যাশম্যাপ এবং হ্যাশটেবলের অন্তর্ভুক্ত

হ্যাশম্যাপ এবং হ্যাশটেবল উভয়ই java.util.Map ইন্টারফেস প্রয়োগ করে তবে কিছু পার্থক্য রয়েছে যা আরও কার্যকর কোড লিখতে জাভা বিকাশকারীদের অবশ্যই বুঝতে হবে। জাভা 2 প্ল্যাটফর্ম v1.2 হিসাবে, হ্যাশটেবল শ্রেণিটি জাভা সংগ্রহের ফ্রেমওয়ার্কের সদস্য হয়ে মানচিত্র ইন্টারফেস বাস্তবায়নের জন্য পুনরায় প্রবর্তিত হয়েছিল।

  1. হ্যাশম্যাপ এবং হ্যাশটেবলের মধ্যে অন্যতম প্রধান পার্থক্য হ্যাশম্যাপটি অ-সিঙ্ক্রোনাইজড, হ্যাশটবাল সিঙ্ক্রোনাইজড, যার অর্থ হ্যাশটেবল থ্রেড-নিরাপদ এবং একাধিক থ্রেডের মধ্যে ভাগ করা যেতে পারে তবে হ্যাশম্যাপটি সঠিক সিঙ্ক্রোনাইজেশন ছাড়া একাধিক থ্রেডের মধ্যে ভাগ করা যায় না। জাভা 5 প্রবর্তন করেছে কনক্রেনর হ্যাশম্যাপ যা হ্যাশটেবলের বিকল্প এবং জাভাতে হ্যাশটেবলের চেয়ে আরও ভাল স্কেলাবিলিটি সরবরাহ করে yn সিঙ্ক্রোনাইজ করা মানে শুধুমাত্র একটি থ্রেড একটি সময়ে হ্যাশ টেবিলটি সংশোধন করতে পারে। মূলত, এর অর্থ হ্যাশটেবলে আপডেট করার আগে যে কোনও থ্রেডের জন্য অবজেক্টটিতে একটি লক অর্জন করতে হবে অন্যরা লকটি প্রকাশের জন্য অপেক্ষা করবে।

  2. হ্যাশম্যাপ শ্রেণিটি হ্যাশটেবলের সমতুল্য, এটি নালার অনুমতি দেয় ব্যতীত। (হ্যাশম্যাপ কী এবং মান হিসাবে নাল মানকে মঞ্জুরি দেয় যেখানে হ্যাশটেবল নালগুলি মঞ্জুরি দেয় না)।

  3. হ্যাশম্যাপ বনাম হ্যাশটেবলের মধ্যে তৃতীয় তাত্পর্যপূর্ণ পার্থক্য হ্যাশমে্যাপের ইলিট্রেটর একটি ব্যর্থ-দ্রুত পুনরুক্তিকারী এবং হ্যাশটেবলের জন্য গণক না থাকলে এবং যদি কোনও অন্য থ্রেড আইট্রেটরের নিজস্ব অপসারণ ব্যতীত কোনও উপাদান যুক্ত বা মুছে ম্যাপকে কাঠামোগত পরিবর্তন করে তবে (হ্যাশমে্যাপে আইট্রেটার একটি ব্যর্থ-দ্রুত পুনরুদ্ধারকারী) throw ) পদ্ধতি। তবে এটি কোনও গ্যারান্টিযুক্ত আচরণ নয় এবং জেভিএম সেরা চেষ্টা করে এটি করবে। এটি জাভাতে গণনা এবং আইট্রেটারের মধ্যেও একটি গুরুত্বপূর্ণ পার্থক্য।

  4. হ্যাশটেবল এবং হ্যাশম্যাপের মধ্যে আরও একটি উল্লেখযোগ্য পার্থক্য হ'ল থ্রেড-সুরক্ষা এবং সিঙ্ক্রোনাইজেশনের কারণে হ্যাশটেবল একক থ্রেডযুক্ত পরিবেশে যদি হ্যাশম্যাপের তুলনায় অনেক ধীর হয়। সুতরাং আপনার যদি সিঙ্ক্রোনাইজেশন প্রয়োজন হয় না এবং হ্যাশম্যাপটি কেবল একটি থ্রেড দ্বারা ব্যবহৃত হয় তবে এটি জাভাতে হ্যাশটেবল সম্পাদন করে।

  5. হ্যাশম্যাপ গ্যারান্টি দেয় না যে সময়ের সাথে মানচিত্রের ক্রম স্থির থাকবে।

দ্রষ্টব্য যে হাশম্যাপ দ্বারা সিঙ্ক্রোনাইজ করা যায়

Map m = Collections.synchronizedMap(hashMap);

সংক্ষেপে জাভাতে হ্যাশটেবল এবং হ্যাশম্যাপের মধ্যে উল্লেখযোগ্য পার্থক্য রয়েছে যেমন থ্রেড-সুরক্ষা এবং গতি এবং এর ভিত্তিতে কেবল হ্যাশটেবল ব্যবহার করুন যদি আপনার একেবারে থ্রেড-সুরক্ষা প্রয়োজন হয়, আপনি যদি জাভা 5 তে চালাচ্ছেন তবে জাভাতে সাম্প্রতিক হ্যাশম্যাপ ব্যবহারের বিষয়টি বিবেচনা করুন।


সাম্প্রতিক হ্যাশম্যাপটি রিড-সিঙ্ক্রোনাইজড নয়, যেখানে হ্যাশটেবল। সুতরাং আপনার যদি লেখার সাথে একসাথে সংখ্যক পাঠ্য ক্রিয়াকলাপ ঘটে থাকে তবে আপনি ডেটা অখণ্ডতার বিষয়ে যত্নশীল হলে একটি হ্যাশটেবল আপনাকে আরও ভাল পরিবেশন করতে পারে।
ইগোরগানাপলস্কি

5

হ্যাশম্যাপ এবং হ্যাশটেবল উভয়ই কী এবং মান আকারে ডেটা সঞ্চয় করতে ব্যবহৃত হয়। উভয়ই অনন্য কীগুলি সংরক্ষণ করতে হ্যাশিং কৌশল ব্যবহার করছেন। হ্যাশম্যাপ এবং হ্যাশটেবল শ্রেণীর মধ্যে অনেকগুলি পার্থক্য রয়েছে যা নীচে দেওয়া হয়েছে।

এখানে চিত্র বর্ণনা লিখুন


দুর্দান্ত ভিজ্যুয়াল সারসংক্ষেপ!
নাদজিব মামি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.