ডিফল্ট .Qquals এবং .hashCode আমার ক্লাসগুলির জন্য কীভাবে কাজ করবে?


106

বলুন আমার নিজস্ব ক্লাস আছে

public class MyObj { /* ... */ }

এর কিছু বৈশিষ্ট্য ও পদ্ধতি রয়েছে। এটি সমানগুলি কার্যকর করে না, হ্যাশকোড প্রয়োগ করে না।

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

উত্তর:


94

হ্যাঁ, ডিফল্ট বাস্তবায়ন হ'ল অবজেক্টের (সাধারণত কথা বলার; আপনি যদি এমন শ্রেণীর থেকে উত্তরাধিকারী হন যা সমান এবং / অথবা হ্যাশকোড পুনরায় সংজ্ঞায়িত হয় তবে পরিবর্তে আপনি সেই প্রয়োগটি ব্যবহার করবেন)।

ডকুমেন্টেশন থেকে:

equals

শ্রেণীর অবজেক্টের জন্য সমান পদ্ধতিটি অবজেক্টগুলিতে সর্বাধিক বৈষম্যমূলক সমতুল্য সম্পর্কের প্রয়োগ করে; এটি হ'ল x এবং y এর কোনও নন-রেফারেন্স রেফারেন্সের মানগুলির জন্য, যদি এই পদ্ধতিটি সত্য হয় তবেই যদি x এবং y একই বস্তুর উল্লেখ করে (x == y এর মান সত্য থাকে)।

hashCode

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


50

থেকে Objectজেভিএম বাস্তবায়নের এক:

public boolean equals(Object object) {
    return this == object;
}

public int hashCode() {
    return VMMemoryManager.getIdentityHashCode(this);
}

উভয় ক্ষেত্রে এটি কেবল প্রশ্নযুক্ত বস্তুর মেমরি ঠিকানাগুলির তুলনা করে।


7
এটি জেডিকের কোন সংস্করণ? ইন v6u23 ea:public native int hashCode();
খচিক

@খা - আপনি ঠিক বলেছেন, আমি মনে করি যে এটি আসলে কী করেছে তা দেখার জন্য আমি একটি দেশীয় বাস্তবায়ন ট্র্যাক করেছি
ব্র্যাড ম্যাসে

10

অবজেক্টের equals()এবং এর ডিফল্ট বাস্তবায়ন রয়েছে hashCode()। আপনি যদি নিজের প্রয়োগ বাস্তবায়ন না করেন তবে সেগুলি ব্যবহার করা হবে। কারণ এর equals()অর্থ একটি ==তুলনা: অবজেক্টগুলি কেবল তখনই সমান হবে যদি তারা ঠিক একই জিনিস হয়। কারণ hashCode(), জাভাদোকের একটি ভাল ব্যাখ্যা রয়েছে।

আরও তথ্যের জন্য, কার্যকর জাভা, অধ্যায় 3 (পিডিএফ), আইটেম 8 দেখুন।


1

হ্যাঁ, Objectক্লাস থেকে যেহেতু আপনার ক্লাসটি অবজেক্টকে প্রসারিত করে। equalsসহজভাবে ফিরে আসে this == objhashCodeবাস্তবায়ন দেশীয়। কেবল একটি অনুমান - এটি বস্তুটিতে পয়েন্টারটি দেয়।


2
এটি মেমোরিতে অবস্থিত অবজেক্টের পয়েন্টার, তবে এটি বস্তুর কোনও মেমরি ঠিকানা নয়। জিসি বস্তুটিকে মেমোরির আশেপাশে সরিয়ে নিতে পারে এবং হ্যাশ কোডটি একই থাকবে।
জেরেমি

@ জেরেমি ধন্যবাদ stackoverflow.com/questions/2427631/… আকর্ষণীয় হতে পারে।
খচিক

1

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

অ্যাপাচি কমন্স ল্যাং থেকে হ্যাশকোডবিল্ডার এবং ইক্যুয়ালস বিল্ডারকে ধন্যবাদ জানিয়ে এই পদ্ধতিগুলির নিজস্ব বাস্তবায়ন সরবরাহ করা বেশ সহজ ।


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

1
@ বাসিল: আমি মনে করি না যে এই বিরোধী। অবশ্যই ডিফল্ট বাস্তবায়ন কাজ করবে ... একরকম, তবে আপনার প্রত্যাশার মতো নয়। এটি হল যেহেতু সমান () রেফারেন্স সমতা ব্যবহার করে, অন্যথায় দুটি অভিন্ন বস্তু ডিফল্ট বাস্তবায়নের দৃষ্টিতে "আলাদা" হবে। ফলস্বরূপ, আপনি আপনার সেটে ঠিক একই জিনিসটির দুটি পৃথক উদাহরণ থাকতে পারেন। এবং ডুপ্লিকেটগুলি মুছে ফেলতে চাইলে সেটগুলির সাধারণ ব্যবহারটি হ'ল ...
Paweł Dyda

@ পাওয়েডায়দা: সাধারণত পরিবর্তনীয় ধরণের জন্য ডিফল্ট আচরণটি সঠিক। যদি Fooএবং Barকোনও মিউচ্যুয়াল টাইপের দুটি পৃথক দৃষ্টান্তের উল্লেখ হয় এবং একটি পদ্ধতি রয়েছে (উদাহরণস্বরূপ SomeMutatingMethod) যেমন এটি একইভাবে Foo.SomeMutatingMethod()প্রভাবিত করে না , তবে এই পার্থক্যটি বস্তুগুলিকে অসম হিসাবে বিবেচনা করার জন্য পর্যাপ্ত হওয়া উচিত। BarFoo
সুপারক্যাট

0

আইবিএম এর বিকাশকারীরা বলেছেন:

এই ডিফল্ট বাস্তবায়নের অধীনে, দুটি রেফারেন্স কেবলমাত্র যদি একই বস্তুকে বোঝায় তবে তা সমান। একইভাবে, অবজেক্ট দ্বারা সরবরাহিত হ্যাশকোড () এর ডিফল্ট প্রয়োগকরণটি বস্তুর মেমরির ঠিকানাটি একটি পূর্ণসংখ্য মানের সাথে ম্যাপ করে is

তবে নির্দিষ্ট বিক্রেতার জাভা সংস্করণটির সঠিক প্রয়োগের বিশদ সম্পর্কে নিশ্চিত হতে উত্স হিসাবে দেখা ভাল (এটি উপলব্ধ থাকলে) সম্ভবত

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