জাভা: সমতা বনাম পরিচয়

জাভা সাক্ষাত্কার বা পরীক্ষার গবেষণাপত্রগুলিতে সময়ে সময়ে পপ আপ হয় এমন কিছু হ'ল সাম্যতা এবং পরিচয়ের পার্থক্য সম্পর্কে একটি প্রশ্ন।

আপনাকে পার্থক্যটি ব্যাখ্যা করতে বা উদাহরণগুলি প্রদর্শন করতে বলা হতে পারে।

কিন্তু হেক এই জিনিসগুলি কি ?! তাঁরা কি বোঝাতে চাইছেন?! আমি তাদের কীভাবে মনে রাখতে পারি ?!

ভাল, আতঙ্কিত হবেন না! সামঞ্জস্যতা এবং পরিচয় আসলে একবার সরাসরি জানতে পেরে আপনি সেগুলি জানতে পারেন। আমরা এখনই যা করতে যাচ্ছি!

  • পরিচয়: ==
  • সমতা: সমান (), হ্যাশকোড ()

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

সাম্যের উদাহরণ

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

পরিচয়

পরিচয়টিকে অর্থ "অভিন্ন" হিসাবে ভাবুন। পরিচয়টি যেখানে দুটি বা ততোধিক রেফারেন্স ভেরিয়েবল একই বস্তুর দিকে নির্দেশ করে যেমন:

বিড়াল বিড়াল 1 = নতুন বিড়াল ("নাইজেল");
বিড়াল ক্যাট 2 = বিড়াল 1;

উপরেরটি পরিচয়ের উদাহরণ। একটি নতুন ক্যাট অবজেক্ট তৈরি হয়েছিল (cat1) এবং তারপরে একটি রেফারেন্স ভেরিয়েবল (cat2) কে cat1 এর সমান করা হয়েছিল যাতে দুটি রেফারেন্স ভেরিয়েবল একই বস্তুর দিকে নির্দেশ করে এবং সেগুলি অভিন্ন ident ক্যাট 1 এবং ক্যাট 2 উভয়ই "নাইজেল" উল্লেখ করছে।

দুটি বস্তু অভিন্ন কিনা তা পরীক্ষা করতে আমরা নীচের পুরো কোডটিতে দেখতে পেলাম আমরা == অপারেটরটি ব্যবহার করি।

সম্পূর্ণ কোড:

পাবলিক ক্লাস বিড়াল {
 স্ট্রিং নাম;
 পাবলিক বিড়াল (স্ট্রিং নাম) {
 this.name name =;
 }
 পাবলিক স্ট্যাটিক অকার্যকর প্রধান (স্ট্রিং [] আরগস) {
 বিড়াল বিড়াল 1 = নতুন বিড়াল ("নাইজেল");
 বিড়াল ক্যাট 2 = বিড়াল 1;
 System.out.println (cat2 == cat1);
 }
}
আউটপুট: সত্য // ক্যাট 1 এবং ক্যাট 2 একরকম

এখন সমতা জন্য

সমতা সহ, এটি আমরা দেখি এমন ডেটা। যে কোনও ভেরিয়েবল যেমন "নাম", "বয়স", "জন্ম তারিখ" এবং আরও অনেক কিছু, দুটি বস্তুর জন্য একই হতে পারে। আমাদের দুটি পদ্ধতি বাস্তবায়নের জন্য সমতা পরীক্ষা করার জন্য আরও জটিল:

  • হ্যাশ কোড()
  • সমান ()

সমান পদ্ধতি:
আমরা যখন সমান পদ্ধতি তৈরি করি তখন আমাদের ডিফল্টটিকে ওভাররাইড করতে হয় অন্যথায় এটি পরিচয়ের তুলনা করার মতোই কাজ করবে।

@অগ্রাহ্য করা
 পাবলিক বুলিয়ান সমান (অবজেক্ট ও) {
 যদি (o == নাল) মিথ্যা ফেরত দেয়;
 যদি (ও == এটি) সত্য ফিরে আসে;
 যদি (getClass ()! = o.getClass ()) মিথ্যা ফেরত দেয়;
 বিড়াল বিড়াল = (বিড়াল) o;
 প্রত্যাবর্তন (নাম == বিড়ালের নাম || (নাম! = নাল &&
 name.equals (cat.name)));
 }

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

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

@অগ্রাহ্য করা
 পাবলিক ইন্ট হ্যাশকোড () {
 int ফলাফল = 17;
 ফলাফল = 31 * ফলাফল + নাম.হ্যাশকোড ();
 প্রত্যাবর্তনের ফলাফল;
 }

আপনাকে এই পদ্ধতিগুলি সম্পর্কে খুব বেশি চিন্তা করার দরকার নেই, যতক্ষণ আপনি এগুলি সঠিকভাবে লিখেন ততক্ষণ তারা সাম্যতা নির্ধারণ করার জন্য তাদের কাজটি করবেন।

পুরো প্রোগ্রামে এই সমস্ত কীভাবে একসাথে ফিট হয় তা এখন একবার দেখুন:

ফ্লফি সমতা এবং পরিচয়ের মধ্যে পার্থক্য জানতে চায় যাতে সে তার সিএস 1 পরীক্ষায় উত্তীর্ণ হতে পারে
পাবলিক ক্লাস বিড়াল {
 
 স্ট্রিং নাম;
 পাবলিক বিড়াল (স্ট্রিং নাম) {
 this.name name =;
 }
 পাবলিক স্ট্যাটিক অকার্যকর প্রধান (স্ট্রিং [] আরগস) {
  বিড়াল বিড়াল 1 = নতুন বিড়াল ("নাইজেল");
  বিড়াল ক্যাট 2 = বিড়াল 1;
  বিড়াল cat3 = নতুন বিড়াল ("নাইজেল");
  
  System.out.println (cat1 == cat3);
  // মিথ্যা, পরিচয় পরীক্ষার জন্য (একই জিনিস)
  System.out.println (cat1.equals (cat3));
  // সত্য, সমতার জন্য পরীক্ষা করা (একই ডেটা)
  System.out.println (cat2 == cat1);
  // সত্য, পরিচয়ের জন্য পরীক্ষা করা (একই জিনিস)
  System.out.println (cat2.equals (cat1));
  // সত্য, সমতার জন্য পরীক্ষা করা (একই ডেটা)
  // মনে রাখবেন: যদি বস্তুগুলি অভিন্ন হয় তবে সেগুলিও সমান হবে
 }
 @অগ্রাহ্য করা
 পাবলিক বুলিয়ান সমান (অবজেক্ট ও) {
 যদি (o == নাল) মিথ্যা ফেরত দেয়;
 যদি (ও == এটি) সত্য ফিরে আসে;
 যদি (getClass ()! = o.getClass ()) মিথ্যা ফেরত দেয়;
 বিড়াল বিড়াল = (বিড়াল) o;
 রিটার্ন (নাম == ক্যাট.নেম || (নাম! = নাল && নাম.ইকুয়ালস (ক্যাট.নেম)));
 }
 @অগ্রাহ্য করা
 পাবলিক ইন্ট হ্যাশকোড () {
 int ফলাফল = 17;
 ফলাফল = 31 * ফলাফল + নাম.হ্যাশকোড ();
 প্রত্যাবর্তনের ফলাফল;
 }
}

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

আমরা যখন সমান () পদ্ধতিটি অনুরোধ করি, cat2.equals (cat1), আমরা সমতার জন্য যাচাই করি, যেখানে দুটি বস্তু পৃথক এবং মেমরিতে একই বস্তুর উল্লেখ না করে পরিবর্তে একই ডেটা ধারণ করে।

আশা করি আপনি এখন পরিচয় এবং সাম্যের পার্থক্য সম্পর্কে আরও ভাল বুঝতে পেরেছেন! শুভ কোডিং! :)