@ লম্বোর জবাব যোগ করা
সমান () সমেত আপনাকে কখন ওভাররাইড করতে হবে?
অবজেক্টের সমান () এর ডিফল্ট বাস্তবায়ন
public boolean equals(Object obj) {
return (this == obj);
}
যার অর্থ দুটি বস্তু কেবল তখনই সমান হিসাবে বিবেচিত হবে যদি তাদের কাছে একই মেমরি ঠিকানা থাকে যা আপনি যদি কোনও বস্তুর সাথে নিজেকে তুলনা করে থাকেন তবেই এটি সত্য হবে।
তবে আপনি দুটি বস্তুকে একই বিবেচনা করতে চাইতে পারেন যদি তাদের এক বা একাধিক বৈশিষ্ট্যের জন্য একই মান থাকে (@ লম্বোর উত্তরে প্রদত্ত উদাহরণটি দেখুন)।
সুতরাং আপনি equals()
এই পরিস্থিতিতে ওভাররাইড করবেন এবং সাম্যের জন্য আপনি নিজের শর্ত দেবেন।
আমি সফলভাবে সমান () কার্যকর করেছি এবং এটি দুর্দান্ত কাজ করছে is সুতরাং কেন তারা হ্যাশকোড () পাশাপাশি ওভাররাইড করতে বলছে?
ওয়েল.আপনি আপনার ব্যবহারকারী-সংজ্ঞায়িত শ্রেণিতে "হ্যাশ" ভিত্তিক সংগ্রহগুলি ব্যবহার করবেন না , এটি ঠিক আছে। তবে ভবিষ্যতে কিছু সময় আপনি ব্যবহার করতে পারেন HashMap
বাHashSet
এবং যদি আপনি না override
এবং হ্যাশকোড () "সঠিকভাবে বাস্তবায়ন" , এই হ্যাশ ভিত্তিক সংগ্রহ হিসাবে উদ্দীষ্ট কাজ করবে না।
ওভাররাইড কেবল সমান (@ লম্বোর জবাব যোগ করা)
myMap.put(first,someValue)
myMap.contains(second); --> But it should be the same since the key are the same.But returns false!!! How?
সবার আগে, হ্যাশম্যাপ চেক করে যে হ্যাশকোডের second
মতো হয় first
। মানগুলি একই হলে, এটি একই বালতিতে সাম্যতা যাচাই করতে এগিয়ে যায়।
তবে এখানে এই 2 টি অবজেক্টের জন্য হ্যাশকোড আলাদা (কারণ তাদের ডিফল্ট বাস্তবায়ন থেকে মেমরির ঠিকানা রয়েছে)। সুতরাং এটি সমতা পরীক্ষা করারও যত্ন নেবে না।
আপনার ওভাররাইড সমান () পদ্ধতির অভ্যন্তরে যদি ব্রেকআপপয়েন্ট থাকে তবে তাদের আলাদা আলাদা হ্যাশকোড থাকলে এটি পদক্ষেপ নেবে না।
contains()
চেকগুলি hashCode()
এবং কেবল যদি সেগুলি একই হয় তবে এটি আপনার কল করবেequals()
পদ্ধতিটিকে ।
কেন আমরা সমস্ত বালতিতে সাম্যতার জন্য হ্যাশম্যাপ চেক করতে পারি না? সুতরাং হ্যাশকোড () কে ওভাররাইড করার দরকার নেই আমার !!
তারপরে আপনি হ্যাশ ভিত্তিক সংগ্রহের পয়েন্টটি মিস করছেন। নিম্নোক্ত বিবেচনা কর :
Your hashCode() implementation : intObject%9.
নীচে বালতি আকারে সংরক্ষণ করা কীগুলি রয়েছে।
Bucket 1 : 1,10,19,... (in thousands)
Bucket 2 : 2,20,29...
Bucket 3 : 3,21,30,...
...
বলুন, মানচিত্রটিতে কীটি রয়েছে কিনা তা আপনি জানতে চান 10 আপনি কি সমস্ত বালতি অনুসন্ধান করতে চান? অথবা আপনি কি কেবল একটি বালতি অনুসন্ধান করতে চান?
হ্যাশকোডের ভিত্তিতে, আপনি সনাক্ত করতে পারবেন যে যদি 10 উপস্থিত থাকে তবে এটি অবশ্যই বালতি 1 এ উপস্থিত থাকতে হবে So সুতরাং কেবল বালতি 1 অনুসন্ধান করা হবে !!