জাভাতে হ্যাশম্যাপ এবং মানচিত্রের মধ্যে পার্থক্য কী?


348

আমি তৈরি নীচের মানচিত্রের মধ্যে পার্থক্য কী (অন্য প্রশ্নে লোকেরা এগুলি আপাতদৃষ্টিতে বিনিময়যোগ্যভাবে ব্যবহার করে উত্তর দিয়েছে এবং আমি / তারা কীভাবে আলাদা তা ভাবছি):

HashMap<String, Object> map = new HashMap<String, Object>();
Map<String, Object> map = new HashMap<String, Object>();

মনে করুন আপনি হাশম্যাপ এবং মেরি মানচিত্র ব্যবহার করে বাস্তবায়ন করেছেন। এটি সংকলন করা হবে?
গিলবার্টস

উত্তর:


445

বস্তুর মধ্যে কোনও পার্থক্য নেই; HashMap<String, Object>উভয় ক্ষেত্রেই আপনার একটি রয়েছে। আপনার বস্তুটির ইন্টারফেসের মধ্যে একটি পার্থক্য রয়েছে । প্রথম ক্ষেত্রে, ইন্টারফেসটি HashMap<String, Object>অন্যদিকে এটির ক্ষেত্রে Map<String, Object>। তবে অন্তর্নিহিত বস্তুটি একই।

ব্যবহারের সুবিধা Map<String, Object>হ'ল আপনি অন্তর্নিহিত অবজেক্টটিকে যে কোনও কোড ব্যবহার করছেন না সেটিকে আপনার চুক্তি ভঙ্গ না করে ভিন্ন ধরণের মানচিত্র হিসাবে পরিবর্তন করতে পারেন। আপনি যদি এটি হিসাবে ঘোষণা করেন HashMap<String, Object>তবে অন্তর্নিহিত বাস্তবায়নটি পরিবর্তন করতে চাইলে আপনাকে আপনার চুক্তিটি পরিবর্তন করতে হবে।


উদাহরণ: ধরা যাক আমি এই ক্লাসটি লিখি:

class Foo {
    private HashMap<String, Object> things;
    private HashMap<String, Object> moreThings;

    protected HashMap<String, Object> getThings() {
        return this.things;
    }

    protected HashMap<String, Object> getMoreThings() {
        return this.moreThings;
    }

    public Foo() {
        this.things = new HashMap<String, Object>();
        this.moreThings = new HashMap<String, Object>();
    }

    // ...more...
}

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

পরে, মেরি কোড এটি সাবক্লাসিংয়ে লেখেন। উভয়ের সাথে তার কিছু করার দরকার ছিল thingsএবং moreThingsতাই স্বাভাবিকভাবেই সে এটিকে একটি সাধারণ পদ্ধতিতে রাখে এবং তার পদ্ধতিটি সংজ্ঞায়িত করার সময় getThings/ আমি একই ধরণের ব্যবহার করি getMoreThings:

class SpecialFoo extends Foo {
    private void doSomething(HashMap<String, Object> t) {
        // ...
    }

    public void whatever() {
        this.doSomething(this.getThings());
        this.doSomething(this.getMoreThings());
    }

    // ...more...
}

পরে আমি সিদ্ধান্ত নেন যে আসলে, এটা ভাল যদি আমি ব্যবহার করেন TreeMapপরিবর্তে HashMapমধ্যে Foo। আমি আপডেট Fooপরিবর্তন HashMapকরতে TreeMap। এখন, SpecialFooআর সংকলন করবেন না, কারণ আমি চুক্তিটি ভঙ্গ করেছি: Fooবলত এটি সরবরাহ করে HashMapতবে এখন TreeMapsপরিবর্তে এটি সরবরাহ করে। সুতরাং আমাদের SpecialFooএখনই ঠিক করতে হবে (এবং এই ধরণের জিনিসটি একটি কোডবেসের মাধ্যমে ছড়িয়ে দিতে পারে)।

আমার বাস্তবায়নটি ব্যবহার করার HashMap(এবং তা ঘটে) ভাগ করে নেওয়ার সত্যিকারের সঠিক কারণ না থাকলে আমার কী করা উচিত ছিল তা ঘোষণা করা হয়েছিল getThingsএবং getMoreThingsকেবল Map<String, Object>তার চেয়ে বেশি নির্দিষ্ট না হয়ে ফিরে আসা ছিল। আসলে, অন্য কিছু করার জন্য একটি ভাল কারণ ব্যতীত, এমনকি Fooআমার মধ্যেও সম্ভবত ঘোষণা করা উচিত thingsএবং / moreThingsহিসাবে Mapনয় :HashMapTreeMap

class Foo {
    private Map<String, Object> things;             // <== Changed
    private Map<String, Object> moreThings;         // <== Changed

    protected Map<String, Object> getThings() {     // <== Changed
        return this.things;
    }

    protected Map<String, Object> getMoreThings() { // <== Changed
        return this.moreThings;
    }

    public Foo() {
        this.things = new HashMap<String, Object>();
        this.moreThings = new HashMap<String, Object>();
    }

    // ...more...
}

আমি এখন Map<String, Object>যেখানেই পারছি সর্বত্র কীভাবে ব্যবহার করছি তা নোট করুন , কেবলমাত্র যখন আমি আসল অবজেক্ট তৈরি করি তখনই সুনির্দিষ্ট।

আমি যদি তা করে থাকি তবে মেরি এটি করতেন:

class SpecialFoo extends Foo {
    private void doSomething(Map<String, Object> t) { // <== Changed
        // ...
    }

    public void whatever() {
        this.doSomething(this.getThings());
        this.doSomething(this.getMoreThings());
    }
}

... এবং পরিবর্তনগুলি সংকলন বন্ধ Fooকরত না SpecialFoo

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

এটি কোনও অন্ধ নিয়ম নয়, তবে সাধারণভাবে, সবচেয়ে সাধারণ ইন্টারফেসে কোডিং আরও নির্দিষ্ট কিছুতে কোডিংয়ের চেয়ে কম ভঙ্গুর হতে চলেছে। যদি আমি যে মনে চাই, আমি একটি নির্মিত হতো না Fooযে, মরিয়মের সেট আপ দিয়ে ব্যর্থতার জন্য SpecialFooমেরি যদি এটি মনে রাখে, তবে আমি গণ্ডগোল করলেও Fooতিনি তার Mapপরিবর্তে তার ব্যক্তিগত পদ্ধতি ঘোষণা করতেন HashMapএবং আমার পরিবর্তিত Fooচুক্তি তার কোডটির উপর প্রভাব ফেলবে না।

কখনও কখনও আপনি এটি করতে পারবেন না, কখনও কখনও আপনাকে নির্দিষ্ট হতে হবে। তবে আপনার যদি না হওয়ার কোনও কারণ না থাকে তবে সর্বনিম্ন-নির্দিষ্ট ইন্টারফেসের দিকে ভুল করুন।


56

মানচিত্র হ্যাশম্যাপ প্রয়োগ করে এমন একটি ইন্টারফেস । পার্থক্যটি হ'ল দ্বিতীয় বাস্তবায়নে আপনার হ্যাশম্যাপ সম্পর্কিত রেফারেন্সটি কেবল মানচিত্র ইন্টারফেসে সংজ্ঞায়িত ফাংশনগুলির ব্যবহারের অনুমতি দেবে, যখন প্রথমটি হ্যাশম্যাপে কোনও পাবলিক ফাংশন ব্যবহারের অনুমতি দেয় (যার মধ্যে মানচিত্র ইন্টারফেস অন্তর্ভুক্ত)।

আপনি যদি সূর্যের ইন্টারফেস টিউটোরিয়ালটি পড়েন তবে সম্ভবত এটি আরও অর্থবোধ করবে


আমি ধরে নিলাম: প্রথম = হ্যাশম্যাপ <স্ট্রিং, অবজেক্ট> ম্যাপ = নতুন হ্যাশম্যাপ <স্ট্রিং, অবজেক্ট> ();
ওয়ানওয়ার্ল্ড

এটি অ্যারেলিস্ট হিসাবে কতবার তালিকা প্রয়োগ করা হয় তার সমান
জেরার্ড

26

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

মানচিত্রে নিম্নলিখিত বাস্তবায়ন রয়েছে:

  1. হ্যাশ মানচিত্র Map m = new HashMap();

  2. LinkedHashMap Map m = new LinkedHashMap();

  3. গাছের মানচিত্র Map m = new TreeMap();

  4. WeakHashMap Map m = new WeakHashMap();

মনে করুন আপনি একটি পদ্ধতি তৈরি করেছেন (এটি কেবলমাত্র সিউডোকোড)।

public void HashMap getMap(){
   return map;
}

মনে করুন আপনার প্রকল্পের প্রয়োজনীয়তা পরিবর্তন হয়েছে:

  1. পদ্ধতিটিতে মানচিত্রের বিষয়বস্তুগুলি ফিরিয়ে দেওয়া উচিত - ফেরতের দরকার HashMap
  2. পদ্ধতিটি সন্নিবেশ ক্রমে মানচিত্র কীগুলি ফেরত পাঠাতে হবে - ফেরতের প্রকারটিতে পরিবর্তন HashMapকরতে হবে LinkedHashMap
  3. পদ্ধতিটিতে মানচিত্র কীগুলি সাজানো ক্রমে ফেরত দেওয়া উচিত - ফেরতের প্রকারটি এতে পরিবর্তন LinkedHashMapকরতে হবে TreeMap

যদি আপনার পদ্ধতিটি Mapইন্টারফেস প্রয়োগ করে এমন কোনও পরিবর্তে নির্দিষ্ট ক্লাসগুলি ফেরত দেয়, আপনাকে getMap()প্রতিবারের পদ্ধতিটির রিটার্নের ধরণটি পরিবর্তন করতে হবে ।

তবে আপনি যদি জাভার পলিমারফিজম বৈশিষ্ট্যটি ব্যবহার করেন এবং নির্দিষ্ট ক্লাস ফিরিয়ে দেওয়ার পরিবর্তে ইন্টারফেসটি ব্যবহার করেন Map, এটি কোড পুনরায় ব্যবহারযোগ্যতা উন্নত করে এবং প্রয়োজনীয় পরিবর্তনের প্রভাবকে হ্রাস করে।


17

আমি কেবল গ্রহণযোগ্য উত্তরের মন্তব্য হিসাবে এটি করতে যাচ্ছিলাম তবে এটি খুব মজাদার হয়েছে (আমি লাইন ব্রেক না পেয়ে ঘৃণা করি)

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

হুবহু - এবং আপনি সর্বদা আপনি সম্ভবত পারেন এমন সবচেয়ে সাধারণ ইন্টারফেসটি ব্যবহার করতে চান। অ্যারেলিস্ট বনাম লিংকডলিস্ট বিবেচনা করুন। আপনি এগুলি কীভাবে ব্যবহার করেন তার মধ্যে বিশাল পার্থক্য, তবে আপনি যদি "তালিকা" ব্যবহার করেন তবে আপনি সহজেই তাদের মধ্যে স্যুইচ করতে পারেন।

প্রকৃতপক্ষে, আপনি আরও গতিশীল বিবৃতি দিয়ে ইনিশিয়ালারের ডান হাতটি প্রতিস্থাপন করতে পারেন। কিভাবে ভালো কিছু সম্পর্কে:

List collection;
if(keepSorted)
    collection=new LinkedList();
else
    collection=new ArrayList();

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

এটি এখানে একটি দুর্দান্ত প্রসারিত কারণ সংগ্রহগুলি সর্বোত্তম উদাহরণ নয়, তবে ওও ডিজাইনের মধ্যে একটি গুরুত্বপূর্ণ ধারণাটি হ'ল একই কোড সহ বিভিন্ন বস্তু অ্যাক্সেস করার জন্য ইন্টারফেসের মুখোমুখি ব্যবহার করা হয়।

মন্তব্য প্রতিক্রিয়া সম্পাদনা করুন:

নীচে আপনার মানচিত্রের মন্তব্য হিসাবে, হ্যাঁ "মানচিত্র" ইন্টারফেস ব্যবহার আপনাকে কেবল সেই পদ্ধতিগুলিতে সীমাবদ্ধ রাখে যদি না আপনি সংগ্রহটি ম্যাপ থেকে হ্যাশম্যাপে ফিরে না ফেলে (যা পুরোপুরি উদ্দেশ্যটি হারাতে পারে)।

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

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

ইন্টারফেস দ্বারা নির্দেশিত ভূমিকার অর্ধ-ঝরঝরে দিকটিও লক্ষ্য করুন। একটি লিংকডলিস্ট একটি ভাল স্ট্যাক বা সারি তৈরি করে, একটি অ্যারেলিস্ট একটি ভাল স্ট্যাক তৈরি করে তবে একটি ভয়াবহ সারি (আবার, একটি অপসারণ পুরো তালিকার পরিবর্তনের কারণ হয়ে দাঁড়ায়) তাই লিংকডলিস্ট সারি ইন্টারফেস প্রয়োগ করে, অ্যারেলিস্ট তা করে না।


তবে এই উদাহরণে, আমি কেবল সাধারণ তালিকা শ্রেণি থেকে পদ্ধতিগুলি পাই, তাই না? আমি এটিকে লিঙ্কডলিস্ট () বা একটি অ্যারেলিস্ট () তৈরি করি কিনা তা বিবেচনা না করেই? এটি কেবলমাত্র যদি আমি সন্নিবেশ বাছাই করি (যা আমি কল্পনা করি যে লিঙ্কডলিস্ট এবং অ্যারেলিস্ট উত্তরাধিকারসূত্রে প্রাপ্ত তালিকার জন্য একটি পদ্ধতি হওয়া আবশ্যক) এটি লিংকডলিস্টে দ্রুত কাজ করে?
টনি স্টার্ক

আমি অনুমান করি যে আমি কী খুঁজছি তা হ'ল যখন আমি বলি মানচিত্র <স্ট্রিং, স্ট্রিং> এম = নতুন হ্যাশম্যাপ <স্ট্রিং, স্ট্রিং> () আমার মানচিত্র এম হাশম্যাপের নির্দিষ্ট পদ্ধতিগুলি ব্যবহার করতে পারে বা না পারে। আমি ভাবছি তা পারছে না?
টনি স্টার্ক

আহ, অপেক্ষা করুন, না, আমার ম্যাপ মি থেকে উপরের হাশম্যাপ থেকে অবশ্যই পদ্ধতিগুলি থাকতে হবে।
টনি স্টার্ক

সুতরাং মূলত 'ইন্টারফেস অর্থে' মানচিত্রটি ব্যবহারের একমাত্র উপকার হ'ল আমার যদি এমন কোনও পদ্ধতি থাকে যার জন্য মানচিত্রের প্রয়োজন হয় তবে আমি গ্যারান্টি দিচ্ছি যে কোনও ধরণের মানচিত্র এই পদ্ধতিতে কাজ করবে। তবে আমি যদি হ্যাশম্যাপ ব্যবহার করি তবে আমি বলছি যে পদ্ধতিটি কেবল হ্যাশম্যাপের সাহায্যে কাজ করে। বা, অন্য কোনও উপায়ে বলতে গেলে, আমার পদ্ধতিতে কেবল মানচিত্র শ্রেণিতে সংজ্ঞায়িত পদ্ধতি ব্যবহার করা হয় তবে মানচিত্রের প্রসারিত অন্যান্য শ্রেণীর দ্বারা উত্তরাধিকার সূত্রে প্রাপ্ত।
টনি স্টার্ক

আপনি উপরে উল্লিখিত পার্ক ছাড়াও, যেখানে তালিকা ব্যবহারের অর্থ রানটাইম পর্যন্ত আমি কোন ধরণের তালিকা চাই তা সিদ্ধান্ত নেওয়ার দরকার নেই, যদিও ইন্টারফেসের জিনিসটি উপস্থিত না থাকলে আমাকে সংকলন এবং চালনার আগে একটি বেছে নিতে হবে
টনি স্টার্ক

12

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


8

আপনার দ্বিতীয় উদাহরণে "মানচিত্র" রেফারেন্স টাইপের Map, যা একটি ইন্টারফেস HashMap(এবং অন্যান্য ধরণের Map) দ্বারা প্রয়োগ করা হয় । এই ইন্টারফেসটি এমন একটি চুক্তি যা বলা হচ্ছে যে অবজেক্টটি বিভিন্ন ক্রিয়াকলাপগুলির (যেমন put, get) মানগুলিকে মানচিত্র করে এবং সমর্থন করে । এরা বলছে বাস্তবায়ন সম্পর্কে কিছুই এর Map(এই ক্ষেত্রে একটি HashMap)।

দ্বিতীয় পদ্ধতির সাধারণত অগ্রাধিকার দেওয়া হয় কারণ আপনি সাধারণত কোনও মানচিত্র প্রয়োগ Mapবা কোনও এপিআই সংজ্ঞা ব্যবহারের মাধ্যমে নির্দিষ্ট মানচিত্রের প্রয়োগটি প্রকাশ করতে চান না ।


8

মানচিত্র হ'ল ম্যাপের স্ট্যাটিক ধরণের , আর হ্যাশম্যাপটি ম্যাপের গতিশীল ধরণের । এর অর্থ এই যে সংকলকটি আপনার মানচিত্রের অবজেক্টটিকে মানচিত্রের এক ধরণের মান্য হিসাবে বিবেচনা করবে, যদিও রানটাইম হলেও এটি এর কোনও উপ-টাইপের দিকে নির্দেশ করতে পারে।

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

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


4

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

Mapকাঠামো চুক্তিটি HashMapহ'ল এমন বাস্তবায়ন যা বিভিন্ন বাস্তব সমস্যার মোকাবিলা করার জন্য নিজস্ব পদ্ধতি সরবরাহ করে: কীভাবে সূচক গণনা করা যায়, কী ক্ষমতা এবং কীভাবে এটি বৃদ্ধি করা যায়, কীভাবে সন্নিবেশ করা যায়, সূচকটি কীভাবে অনন্য রাখা যায় ইত্যাদি ইত্যাদি contract

সোর্স কোডটি খতিয়ে দেখা যাক:

ইন Mapআমরা পদ্ধতি আছে containsKey(Object key):

boolean containsKey(Object key);

JavaDoc:

বুলিয়ান java.util.Map.containsValue (বস্তুর মান)

যদি এই মানচিত্রটি নির্দিষ্ট মানটিতে এক বা একাধিক কী মানচিত্র করে তবে সত্যটি প্রত্যাবর্তন করে। আরো আনুষ্ঠানিকভাবে, সত্য ফেরৎ যদি এবং কেবল যদি এই মানচিত্রটি মান অন্তত একটি ম্যাপিং রয়েছে vযেমন যে (value==null ? v==null : value.equals(v))। এই ক্রিয়াকলাপটি সম্ভবত মানচিত্র ইন্টারফেসের বেশিরভাগ বাস্তবায়নের জন্য মানচিত্রের আকারে সময়রেখা প্রয়োজন।

পরামিতি: VALUE

মানচিত্র যার উপস্থিতি এই মানচিত্রে পরাজিত করা হয়

রিটার্নস: সত্য

যদি এই মানচিত্রটি নির্দিষ্ট করাতে এক বা একাধিক কী মানচিত্র করে

valueThrows:

ClassCastException - মানটি যদি এই মানচিত্রের জন্য অনুচিত প্রকারের হয় (alচ্ছিক)

নালপয়েন্টার এক্সেপশন - নির্দিষ্ট মানটি যদি নাল হয় এবং এই মানচিত্রটি নাল মানগুলিকে অনুমতি দেয় না (optionচ্ছিক)

এটি বাস্তবায়নের জন্য এর বাস্তবায়ন প্রয়োজন, তবে "এটি কীভাবে" তার স্বাধীনতায় রয়েছে কেবলমাত্র এটি সঠিকভাবে ফিরে আসে তা নিশ্চিত করার জন্য।

ইন HashMap:

public boolean containsKey(Object key) {
    return getNode(hash(key), key) != null;
}

দেখা যাচ্ছে যে HashMapএই মানচিত্রে কী রয়েছে কিনা তা পরীক্ষা করতে হ্যাশকোড ব্যবহার করা হয়। সুতরাং এটির হ্যাশ অ্যালগরিদমের সুবিধা রয়েছে।


3

আপনি একই মানচিত্র তৈরি।

আপনি যখন এটি ব্যবহার করবেন তবে আপনি পার্থক্যটি পূরণ করতে পারেন। প্রথম ক্ষেত্রে আপনি বিশেষ হ্যাশম্যাপ পদ্ধতি ব্যবহার করতে সক্ষম হবেন (তবে বাস্তবে আমি দরকারী কাউকে মনে করি না) এবং আপনি এটি হ্যাশম্যাপ প্যারামিটার হিসাবে পাস করতে সক্ষম হবেন:

public void foo (HashMap<String, Object) { ... }

...

HashMap<String, Object> m1 = ...;
Map<String, Object> m2 = ...;

foo (m1);
foo ((HashMap<String, Object>)m2); 

3

মানচিত্রটি ইন্টারফেস এবং হ্যাশম্যাপ এমন একটি শ্রেণি যা মানচিত্র ইন্টারফেস প্রয়োগ করে


1

মানচিত্রটি ইন্টারফেস এবং হ্যাশম্যাপ এমন শ্রেণি যা প্রয়োগ করে।

সুতরাং এই প্রয়োগে আপনি একই জিনিস তৈরি করুন


0

হ্যাশম্যাপ মানচিত্রের একটি বাস্তবায়ন তাই এটি বেশ একইরকম তবে রেফারেন্স গাইডে যেমন দেখি তেমন "ক্লোন ()" পদ্ধতি রয়েছে)


0
HashMap<String, Object> map1 = new HashMap<String, Object>();
Map<String, Object> map2 = new HashMap<String, Object>();  

সর্বপ্রথমে Mapএকটি ইন্টারফেস এটা পছন্দ বিভিন্ন বাস্তবায়ন হয়েছে - HashMap, TreeHashMap,LinkedHashMap ইত্যাদি ইন্টারফেস বাস্তবায়ন বর্গ জন্য একটি সুপার বর্গ মত কাজ করে। গলি এর নিয়ম কোনো কংক্রিট বর্গ অনুযায়ী যে কার্যকরী সুতরাং Mapএকটি হল Mapএছাড়াও। এর অর্থ আমরা কোনও HashMapপ্রকারের ing Mapালাই ছাড়াই কোনও প্রকারের ভেরিয়েবলকে টাইপ ভেরিয়েবল বরাদ্দ করতে পারি / রাখতে পারি ।

এক্ষেত্রে আমরা কোনও ingালাই বা ডেটা হারানো ছাড়াই নির্ধারণ map1করতে পারি map2-

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