.Equals () এবং == অপারেটরের সাথে দুটি বস্তুর তুলনা করুন


85

আমি একটি Stringক্ষেত্র দিয়ে একটি ক্লাস নির্মাণ । তারপরে আমি দুটি অবজেক্ট তৈরি করেছি এবং আমাকে ==অপারেটর ব্যবহার করে এবং তাদের তুলনা করতে .equals()হবে। আমি যা করেছি তা এখানে:

public class MyClass {

    String a;

    public MyClass(String ab) {
        a = ab;
    }

    public boolean equals(Object object2) {
        if(a == object2) { 
            return true;
        }
        else return false;
    }

    public boolean equals2(Object object2) {
        if(a.equals(object2)) {
            return true;
        }
        else return false;
    }



    public static void main(String[] args) {

        MyClass object1 = new MyClass("test");
        MyClass object2 = new MyClass("test");

        object1.equals(object2);
        System.out.println(object1.equals(object2));

        object1.equals2(object2);
        System.out.println(object1.equals2(object2));
    }


}

সংকলনের পরে এটি ফলাফল হিসাবে দুটি বার মিথ্যা দেখায়। দুটি বস্তুর একই ক্ষেত্র থাকলে - "পরীক্ষা" কেন এটি মিথ্যা?


7
বিটিডব্লিউ, তাকিয়ে equalsএবং equals2: যে কোনও সময় আপনার কাছে ফর্মের কিছু রয়েছে যা if(a) { return true; } else { return false; }সম্ভবত লিখে রাখা উচিত return a
ysavit

@ শ্যাভিত আপনার মানে, বুলিয়ান থেকে স্ট্রিংয়ে পরিবর্তন?
ফাস্টকউই

4
না, আপনার কোডটি জিজ্ঞাসা করছে যে কোনও বুলিয়ান সত্য trueকিনা , এবং যদি তা falseঅন্যথায় থাকে তবে তা ফিরে আসবে । উদাহরণস্বরূপ, if(a.equals(object2)) { return true; } else return falseঠিক হতে পারে return a.equals(object2)
yshavit

উত্তর:


142

==অবজেক্টের রেফারেন্সের সাথে তুলনা করে, এটি পরীক্ষা করে দেখায় যে দুটি অপারেন্ড একই বস্তুর দিকে নির্দেশ করে কিনা ( সমতুল্য বস্তু নয়, একই বস্তু নয়)।

আপনি যদি স্ট্রিংগুলির তুলনা করতে চান (সেগুলিতে একই অক্ষর রয়েছে কিনা তা দেখতে), আপনার ব্যবহার করে স্ট্রিংগুলি তুলনা করতে হবে equals

আপনার ক্ষেত্রে, যদি দুটি MyClassস্ট্রিং সত্যই সমান হিসাবে বিবেচিত হয় যদি স্ট্রিংগুলি মেলে, তবে:

public boolean equals(Object object2) {
    return object2 instanceof MyClass && a.equals(((MyClass)object2).a);
}

... তবে সাধারণত আপনি যদি একটি শ্রেণির সংজ্ঞা দিচ্ছেন তবে একক ক্ষেত্রের সমতুল্যের চেয়ে সমতুল্যতার চেয়ে বেশি কিছু আছে ( aএই ক্ষেত্রে)।


পার্শ্ব নোট: আপনি যদি ওভাররাইড করেন তবে equalsআপনার প্রায় সবসময়ই ওভাররাইড করা উচিত hashCode। এটি equalsজাভাডকে যেমন বলেছে :

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


@ টিজে ইন == বিস্তৃতভাবে অবজেক্টের রেফারেন্সের সাথে তুলনা করে, এর অর্থ কি == দুটি বস্তুর হ্যাশকোডের তুলনা করে?
নরেন্দ্র জাগি

@ নরেন্দ্রজাগি - না, এর অর্থ এই যে জেভিএম দুটি অপারেন্ড উভয়ই একই বস্তুকে বোঝায় কিনা তা পরীক্ষা করে দেখুন। এটি কীভাবে জেভিএমের উপর নির্ভর করে, তবে এটি করার জন্য এটি হ্যাশকোড ব্যবহার করবে এমন ভাবার কোনও কারণ নেই।
টিজে ক্রাউডার 15

19

আপনার সমানগুলি ওভাররাইড করা উচিত

 public boolean equals (Object obj) {
     if (this==obj) return true;
     if (this == null) return false;
     if (this.getClass() != obj.getClass()) return false;
     // Class name is Employ & have lastname
     Employe emp = (Employee) obj ;
     return this.lastname.equals(emp.getlastname());
 }

4
এটি বিতর্কিতভাবে সেরা উত্তর, তবে আপনি আদিম ধরণের জন্য (এটি == নাল) পরিবর্তে এই.ইকোয়্যালস (আপত্তি) ব্যবহার করতে চাইতে পারেন
গুন্ডেরিফাই করুন

10
আমি যুক্তি দিয়েছি যে if (this == null)যাইহোক মামলাটি অপ্রয়োজনীয়; কলিং nullObject.equals(whatever)একটি নাল পয়েন্টার ব্যতিক্রম ছুঁড়ে ফেলছে, তাই আমরা নিরাপদে ধরে নিতে পারি যে thisআমরা যে জাভা পদ্ধতিতে লিখতে পারি তা বাতিল নয়।
মাওরা

5

দেখে মনে হচ্ছে equals2এটি কেবল কল করছে equals, সুতরাং এটি একই ফলাফল দেবে।


4
ওপি স্ট্রিংয়ের equalsপদ্ধতিটিকে কল করছে aযা শ্রেণীর সদস্য। equals2কল করছে নাequals
ইয়িগিত আল্পারস্লান

4
হ্যা ধন্যবাদ. দেখে মনে হচ্ছে যে আমি মাই ক্লাস এবং স্ট্রিংয়ের মধ্যে বিভ্রান্তিকে পুরোপুরি মিস করেছি যা আসল সমস্যা।
হিউ ওল্ফ

5

ওভাররাইট ফাংশন সমান () ভুল। "A" অবজেক্টটি স্ট্রিং ক্লাসের একটি উদাহরণ এবং "অবজেক্ট 2" মাই ক্লাস ক্লাসের একটি উদাহরণ । এগুলি বিভিন্ন শ্রেণি, সুতরাং উত্তরটি "মিথ্যা"।


5

2 টি বস্তুর তুলনা করার সর্বোত্তম উপায় হ'ল তাদেরকে জসন স্ট্রিংয়ে রূপান্তর করা এবং স্ট্রিংগুলির সাথে তুলনা করা, জটিল নেস্টেড অবজেক্টস, ক্ষেত্র এবং / অথবা অ্যারে সম্বলিত অবজেক্টগুলির সাথে ডিল করার সময় এর সহজতম সমাধান।

নমুনা:

import com.google.gson.Gson;


Object a = // ...;
Object b = //...;
String objectString1 = new Gson().toJson(a);
String objectString2 = new Gson().toJson(b); 

if(objectString1.equals(objectString2)){
    //do this
}

9
আমি এটিকে ফোন করতে চাই: ওভারকিল।
রল্ফ ツ

@ রল্ফ your আপনার মতে এটি কেন অত্যধিক দক্ষ? আমি এই সমস্যার সমাধান অনুসন্ধান করেছি এবং এটি এখন পর্যন্ত পাওয়া সবচেয়ে সহজ সমাধান। আরও ভাল পরামর্শ স্বাগত জানাই।
m5seppal

4
কারণ জাভা দিয়ে আপনি প্রথমে কোনও Gsonঅবজেক্ট তৈরি না করে এবং তারপরে কল না করে বস্তুর তুলনা করতে পারেন toJsonGsonবস্তুটি তৈরি করা এবং প্রকৃত বস্তুকে ফ্ল্যাটে রূপান্তর করতে প্রয়োজনীয় যুক্তিকে কল করা String( toJson) অপ্রয়োজনীয় ওভারহেড। আপনি বস্তুগুলিকে প্রথমে জসন স্ট্রিংগুলিতে রূপান্তর না করে তুলনা করতে পারেন (এটি আরও দ্রুত)।
রল্ফ ツ

3

আপনার equals2()পদ্ধতি সর্বদা একই হিসাবে ফিরে আসবে equals()!!

আমার মন্তব্য সহ আপনার কোড :

public boolean equals2(Object object2) {  // equals2 method
    if(a.equals(object2)) { // if equals() method returns true
        return true; // return true
    }
    else return false; // if equals() method returns false, also return false
}

4
ঠিকreturn a.equals(object2);
মোজুবা

2

বিবৃতি a == object2এবং a.equals(object2)উভয় সবসময় ফিরে আসবে falseকারণ aএকটি নয় stringযখন object2একটি দৃষ্টান্ত হলMyClass


2

আপনার প্রয়োগ অবশ্যই পছন্দ করতে হবে:

public boolean equals2(Object object2) {
    if(a.equals(object2.a)) {
        return true;
    }
    else return false;
}

এই প্রয়োগের সাথে আপনার উভয় পদ্ধতি কাজ করবে।


2

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

public class Greeting {
private String greeting;

@Override
public boolean equals(Object obj) {
    if (this == obj) return true;
    return this.toString().equals(obj.toString());
}

@Override
public String toString() {
    return "Greeting{" +
            "greeting='" + greeting + '\'' +
            '}';
}
}

2

"==" অপারেটরটি কেবল সত্যটি প্রত্যাশা করে যদি দুটি রেফারেন্স মেমরিতে একই বস্তুর দিকে নির্দেশ করে। অন্যদিকে সমান () পদ্ধতি অবজেক্টের সামগ্রীর উপর ভিত্তি করে সত্য ফেরায়।

উদাহরণ:

String personalLoan = new String("cheap personal loans");
String homeLoan = new String("cheap personal loans");

//since two strings are different object result should be false
boolean result = personalLoan == homeLoan;
System.out.println("Comparing two strings with == operator: " + result);

//since strings contains same content , equals() should return true
result = personalLoan.equals(homeLoan);
System.out.println("Comparing two Strings with same content using equals method: " + result);

homeLoan = personalLoan;
//since both homeLoan and personalLoan reference variable are pointing to same object
//"==" should return true
result = (personalLoan == homeLoan);
System.out.println("Comparing two reference pointing to same String with == operator: " + result);

আউটপুট: == অপারেটরের সাথে দুটি স্ট্রিংয়ের তুলনা করা: সমান পদ্ধতি ব্যবহার করে একই স্ট্রন্টের সাথে দুটি স্ট্রিংয়ের তুলনা করা: সত্য দুটি স্ট্রিংকে == অপারেটরের সাথে নির্দেশ করে দুটি রেফারেন্সের তুলনা: সত্য

আপনি এই লিঙ্ক থেকে আরও বিশদ পেতে পারেন: http://javarevisited.blogspot.in/2012/12/differences-between-equals-method-and-equality-operator-java.html?m=1


2

আপনার শ্রেণি একই কার্যকারিতা অর্জনের জন্য তুলনামূলক ইন্টারফেস প্রয়োগ করতে পারে। আপনার শ্রেণীর ইন্টারফেসে ঘোষিত তুলনা করা () পদ্ধতিটি প্রয়োগ করা উচিত।

public class MyClass implements Comparable<MyClass>{

    String a;

    public MyClass(String ab){
        a = ab;
    }

    // returns an int not a boolean
    public int compareTo(MyClass someMyClass){ 

        /* The String class implements a compareTo method, returning a 0 
           if the two strings are identical, instead of a boolean.
           Since 'a' is a string, it has the compareTo method which we call
           in MyClass's compareTo method.
        */

        return this.a.compareTo(someMyClass.a);

    }

    public static void main(String[] args){

        MyClass object1 = new MyClass("test");
        MyClass object2 = new MyClass("test");

        if(object1.compareTo(object2) == 0){
            System.out.println("true");
        }
        else{
            System.out.println("false");
        }
    }
}

1

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

boolean b = objectA.equals(objectB);

খ ইতিমধ্যে সত্য বা মিথ্যা।


1

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

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

তুলনামূলক ইন্টারফেসও দুটি বস্তুর তুলনায় ব্যবহৃত হয়


4
আপনার উত্তরটি প্রায় 2 বছর আগে বলা হয়নি যে কিছুই যোগ করেন তা বিবেচনা করুন।
হট লিকস

1

এখানে আউটপুটটি মিথ্যা হবে, প্রথম সোপ্লান স্টেটমেন্টে মিথ্যা বোকাস আপনি মাইক্লাস টাইপের একটি স্ট্রিং টাইপের ভেরিয়েবলকে অন্য মাইক্লাস টাইপের সাথে তুলনা করার চেষ্টা করছেন এবং এটি উভয়ই অবজেক্ট টাইপের কারণে অনুমতি দেবে এবং আপনি "==" অপেরেটর ব্যবহার করেছেন যা প্রকৃত মেমরির সাথে থাকা রেফারেন্স ভেরিয়েবলের মানটি মেমরির অভ্যন্তরীণ প্রকৃত সংকেত নয় check দ্বিতীয় sopln এও আপনি একইভাবে আবার a.equals (অবজেক্ট 2) কল করছেন যেখানে a এর ভিতরে ভ্যারিয়েবল 1। আমাকে এ সম্পর্কে আপনার অনুসন্ধানগুলি জানান।


4
স্ট্যাকওভারফ্লো বিদ্যাধরে আপনাকে স্বাগতম। প্রশ্নটি 14/11/2012 তারিখের এবং ইতিমধ্যে একটি ভাল প্রতিক্রিয়া পেয়েছে (ওপি দ্বারা অনুমোদিত)। আপনি যেটি পেয়েছেন সেটি সঠিক, তবে এটি দরকারী তথ্য যোগ করছে না। আমি আপনাকে কিছু করার আগে নিয়মগুলি পড়ার পরামর্শ দিচ্ছি
নিকাইডো

-3

নীচের কোডে আপনি ওভারডেন পদ্ধতিতে কল করছেন e

পাবলিক বুলিয়ান সমান 2 (অবজেক্ট অবজেক্ট 2) {যদি (a.equals (অবজেক্ট 2)) {// এখানে আপনি ওভারডিডেন পদ্ধতিটি কল করছেন, এজন্য আপনি 2 বার মিথ্যা পেয়ে যাচ্ছেন। সত্য প্রত্যাবর্তন; অন্যথায় মিথ্যা ফিরে; }


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