জাভাতে == এবং সমান () এর মধ্যে পার্থক্য কী?


622

আমি যদি এটি সঠিকভাবে বুঝতে পারি তবে আমি স্পষ্ট করতে চেয়েছিলাম:

  • == একটি রেফারেন্স তুলনা, অর্থাৎ উভয় বস্তু একই মেমরি অবস্থানের দিকে নির্দেশ করে point
  • .equals() বস্তুর মধ্যে মানের তুলনা মূল্যায়ন

43
হ্যাঁ, বেশ অনেকটা
জন কেইন

9
হ্যাঁ, স্পট অন। আপনি .equals()
অর্থসূচক


19
"উভয় বস্তু একই স্মৃতি অবস্থানের দিকে ইঙ্গিত করে" এর মতো একটি বাক্য হ'ল ম্লান ভাষা, যা বোঝা আরও জটিল করে তুলতে পারে। আপনার অর্থ: "উভয় ভেরিয়েবল একই জিনিসকে বোঝায়"। নোট করুন যে একটি ভেরিয়েবল কোনও বস্তু নয়; একটি ভেরিয়েবল একটি বস্তুর রেফারেন্স । অবজেক্টস কিছুই "পয়েন্ট" না।
জেস্পার

উত্তর:


625

সাধারণভাবে, আপনার প্রশ্নের উত্তর "হ্যাঁ", তবে ...

  • .equals(...) এটি যা তুলনা করতে লেখা হয়েছে তা কেবল তার সাথে তুলনা করবে, আর বেশি নয়, কমও নয়।
  • যদি কোনও শ্রেণি সমান পদ্ধতিটিকে ওভাররাইড না করে, তবে এটি equals(Object o)নিকটতম অভিভাবক শ্রেণীর পদ্ধতির ডিফল্ট যা এই পদ্ধতিটিকে ওভাররাইড করে।
  • যদি কোনও প্যারেন্ট ক্লাস কোনও ওভাররাইড সরবরাহ করে না, তবে তা চূড়ান্ত পিতামাতা শ্রেণি, অবজেক্ট থেকে পদ্ধতিটিতে ডিফল্ট হয় এবং সুতরাং আপনি Object#equals(Object o)পদ্ধতিটি রেখে চলেছেন । অবজেক্ট এপিআই অনুসারে এটি সমান ==; এটি হ'ল, যদি সত্য হয় এবং কেবলমাত্র যদি উভয় ভেরিয়েবল একই বস্তুকে উল্লেখ করে, যদি তাদের উল্লেখগুলি একই এবং একই হয়। সুতরাং আপনি অবজেক্টের সমতার জন্য পরীক্ষা করছেন এবং কার্যকরী সমতার জন্য নয়
  • "চুক্তি ভঙ্গ" না করার কারণে hashCodeআপনি ওভাররাইড করলে সর্বদা ওভাররাইড মনে রাখবেন equals। এপিআই অনুসারে, hashCode()দুটি বস্তুর জন্য পদ্ধতি থেকে ফিরে আসা ফলাফলটি একই হতে হবে যদি তাদের equalsপদ্ধতিগুলি সমতুল্য হয় তা দেখায়। বিপরীত না অগত্যা সত্য।

যদি ==মেমরির রেফারেন্সের জন্য পরীক্ষা করে থাকে তবে আমি কেন [এই] [1] [1]: docs.google.com/docament/d/… এ এই অদ্ভুত আচরণ পাচ্ছি? আশা করি আউটপুটটি সত্য হবে। আমার বিভ্রান্তি দূর করতে পারে
জেপিজি

4
@ জেএসকে ডি 1 এবং ডি 2 এর মানগুলি মুদ্রণ করে এবং আমি মনে করি আপনি কেন মিথ্যা প্রত্যাবর্তন করছেন see
BoDidely

2
পছন্দ করুন এটি ছিল কারণ সমস্ত মোড়কের ক্লাসগুলি পরিবর্তনযোগ্য।
জেপিজি

The equals method for class Object implements the most discriminating possible equivalence relation on objects; that is, for any non-null reference values x and y, this method returns true if and only if x and y refer to the same object (x == y has the value true).<br/> Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.( ডকস.অরাকল.com / জাভাসে / / / ডকস / এপি / জাভা / আংল্যাঙ্গ )
অভিজিৎ

অপ্রাসঙ্গিক: আজ আমি নিম্নমানের নবাগত প্রশ্নের মন্তব্য করার সময় ভাল / কার্যকর / ... "অটো" বার্তাগুলি সম্পর্কে একটি মেটা প্রশ্ন ( meta.stackoverflow.com/questions/372795/… ) রেখেছি । আমি প্রাপ্ত প্রতিক্রিয়াটি বেশ অনুভূত হয়েছে "আপনি সম্পূর্ণ ভুল কাজটি করছেন"। এখন আমি কেবল ভাবছি যে আপনি এটিকে কীভাবে দেখছেন? আপনার চলাফেরায় কি "জেনেরিক" বার্তা রয়েছে, নাকি আপনি এ জাতীয় ক্ষেত্রে সম্পূর্ণ নির্দিষ্ট মন্তব্য লিখেন?
ঘোস্টট্যাগ

107

স্ট্রিং ক্লাসের প্রতি শ্রদ্ধা সহ:

সমান () পদ্ধতিটি স্ট্রিং উদাহরণগুলির (হিপগুলিতে) "মান" এর সাথে তুলনা করে নির্বিশেষে যদি দুটি বস্তুর রেফারেন্স একই স্ট্রিং উদাহরণকে উল্লেখ করে বা না করে। স্ট্রিং টাইপের যে কোনও দুটি অবজেক্টের রেফারেন্স যদি একই স্ট্রিং ইনস্ট্যান্সের উল্লেখ করে তবে দুর্দান্ত! যদি দুটি অবজেক্টের রেফারেন্স দুটি ভিন্ন স্ট্রিং দৃষ্টান্তগুলিকে উল্লেখ করে .. এটি কোনও পার্থক্য করে না। এটি প্রতিটি স্ট্রিং উদাহরণের সাথে "মান" (এটি: অক্ষরের অ্যারের সামগ্রীগুলি) যা তুলনা করা হচ্ছে।

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

কোনও ব্যাখ্যা হিসাবে, এটি ডুবে যাক।

আমি আশা করি এটি কিছুটা সাফ করে দেয়।


1
তাহলে স্ট্রিংগুলির জন্য == রেফারেন্সও কি সমান? অর্থাত্ অন্যান্য বস্তুর মতো একই কাজ করে?
JonnyRaa

2
(থ্রেড জাদুবিদ্যা, আমি জানি ...) জন্য StringS, ==রেফারেন্স হিসেবে ভাল সমান, হ্যাঁ, কিন্তু এটা সাধারণত (দুই হিসেবে কাজ করে Stringএকই বিষয়বস্তুর গুলি করবে সাধারণত হতে ==কারণ কিভাবে জাভা হ্যান্ডলগুলি, একে অপরের সাথে) Stringগুলি। এটি সবসময় হবে না এবং এটি অবশ্যই খারাপ অভ্যাস, তবে এটি একটি সাধারণ ভুল, বিশেষত অন্য ভাষা থেকে আসা লোকদের।
টোনিও

7
টনিওর মন্তব্যে যোগ করতে। Stringস্ট্রিং আক্ষরিক থেকে বিল্ডটি এমন কিছুতে যুক্ত করা হবে String constant pool, যেমন String s1 = "someString"; String s2 = "someString;"উভয় s1& s2একই রেফারেন্স ভাগ করে নেবে। s1 == s2সত্য ফিরে আসবে। তবে যদি সেগুলি যদি নির্মাণ করা হয় String constructor, উদাহরণস্বরূপ String s1 = new String("someString"); String s2 = new String("someString");তবে তারা একই রেফারেন্সটি ভাগ করে নেবে না। s1 == s2মিথ্যা ফিরে আসবে।
গ্যাভিন

61

আপনি "আদিম" বা "অবজেক্টের ধরণের" কথা বলছেন কিনা তা নির্ভর করে কিছু ছোট পার্থক্য রয়েছে; আপনি যদি "স্ট্যাটিক" বা "অ-স্থিতিশীল" সদস্যদের বিষয়ে কথা বলছেন তবে একই কথা বলা যেতে পারে; আপনি উপরের সমস্ত মিশ্রণ করতে পারেন ...

এখানে একটি উদাহরণ (আপনি এটি চালাতে পারেন):

public final class MyEqualityTest
{
    public static void main( String args[] )
    {
        String s1 = new String( "Test" );
        String s2 = new String( "Test" );

        System.out.println( "\n1 - PRIMITIVES ");
        System.out.println( s1 == s2 ); // false
        System.out.println( s1.equals( s2 )); // true

        A a1 = new A();
        A a2 = new A();

        System.out.println( "\n2 - OBJECT TYPES / STATIC VARIABLE" );
        System.out.println( a1 == a2 ); // false
        System.out.println( a1.s == a2.s ); // true
        System.out.println( a1.s.equals( a2.s ) ); // true

        B b1 = new B();
        B b2 = new B();

        System.out.println( "\n3 - OBJECT TYPES / NON-STATIC VARIABLE" );
        System.out.println( b1 == b2 ); // false
        System.out.println( b1.getS() == b2.getS() ); // false
        System.out.println( b1.getS().equals( b2.getS() ) ); // true
    }
}

final class A
{
    // static
    public static String s;
    A()
    {
        this.s = new String( "aTest" );
    }
}

final class B
{
    private String s;
    B()
    {
        this.s = new String( "aTest" );
    }

    public String getS()
    {
        return s;
    }

}

আপনি এই লিঙ্কগুলির মাধ্যমে "==" (সমতা অপারেটর) এবং ".equals (...)" (java.lang.Object শ্রেণিতে পদ্ধতি) এর জন্য ব্যাখ্যাগুলি তুলনা করতে পারেন:


2
আকর্ষণীয় উদাহরণ। উপরের উত্তরগুলি থেকে আলাদা দৃষ্টিকোণ। ধন্যবাদ!
এন্ড্রু

1
আমার মতে সেরা উত্তর, কারণ এটি ব্যাখ্যাটি না হারিয়ে অন্যান্য পূর্ণ-পাঠ্য উত্তরের চেয়ে পরিষ্কার (যদি আপনি শ্রেণি এবং স্থির ধারণাগুলি বুঝতে পারেন তবে অবশ্যই)
কার্মার

44

== এবং এর সমান পার্থক্য আমাকে কিছুক্ষণের জন্য বিভ্রান্ত করেছিল যতক্ষণ না আমি এটিকে আরও ঘনিষ্ঠভাবে দেখার সিদ্ধান্ত নিই। তাদের মধ্যে অনেকে বলেছেন যে স্ট্রিংয়ের তুলনা করার জন্য আপনার ব্যবহার করা উচিত equalsএবং নাও== । এই উত্তরে আশা করি আমি পার্থক্য বলতে সক্ষম হব।

এই প্রশ্নের উত্তর দেওয়ার সর্বোত্তম উপায় হ'ল নিজের কাছে কয়েকটি প্রশ্ন জিজ্ঞাসা করা। সুতরাং শুরু করি:

নীচের প্রোগ্রামটির আউটপুট কী:

String mango = "mango";
String mango2 = "mango";
System.out.println(mango != mango2);
System.out.println(mango == mango2);

যদি তুমি বল,

false
true

আমি বলব আপনি ঠিক বলেছেন তবে কেন আপনি তা বললেন ? এবং যদি আপনি বলেন আউটপুট হয়,

true
false

আমি বলব তুমি আছ ভুল বলেছেন তবে আমি আপনাকে এখনও জিজ্ঞাসা করব, আপনি কেন এটি সঠিক বলে মনে করেন?

ঠিক আছে, এর উত্তর দেওয়ার চেষ্টা করি:

নীচের প্রোগ্রামটির আউটপুট কী:

String mango = "mango";
String mango3 = new String("mango");
System.out.println(mango != mango3);
System.out.println(mango == mango3);

এখন আপনি যদি বলেন,

false
true

আমি বলব তুমি ভুল তবে এখন কেন ভুল ? এই প্রোগ্রামের জন্য সঠিক ফলাফল

true
false

উপরের প্রোগ্রামটি তুলনা করুন এবং এটি সম্পর্কে চিন্তা করার চেষ্টা করুন।

ঠিক আছে. এখন এটি সাহায্য করতে পারে (দয়া করে এটি পড়ুন: অবজেক্টের ঠিকানা মুদ্রণ করুন - সম্ভব নয় তবে তবুও আমরা এটি ব্যবহার করতে পারি))

String mango = "mango";
String mango2 = "mango";
String mango3 = new String("mango");
System.out.println(mango != mango2);
System.out.println(mango == mango2);
System.out.println(mango3 != mango2);
System.out.println(mango3 == mango2);
// mango2 = "mang";
System.out.println(mango+" "+ mango2);
System.out.println(mango != mango2);
System.out.println(mango == mango2);

System.out.println(System.identityHashCode(mango));
System.out.println(System.identityHashCode(mango2));
System.out.println(System.identityHashCode(mango3));

আপনি কি উপরের কোডের শেষ তিনটি লাইনের আউটপুট সম্পর্কে চিন্তা করার চেষ্টা করতে পারেন: আমার জন্য আদর্শ এটি প্রিন্ট করেছে ( আপনি কোডটি এখানে দেখতে পারেন ):

false
true
true
false
mango mango
false
true
17225372
17225372
5433634

উহু! এখন আপনি দেখুন পরিচয় হ্যাশকোড (আমের) পরিচয়ের সমান হ্যাশকোড (আম 2) তবে এটি পরিচয়ের সাথে সমান নয় হ্যাশকোড (আম 3)

যদিও সমস্ত স্ট্রিং ভেরিয়েবল - আম, আম 2 এবং আম 3 - এর একই মান রয়েছে যা "আমের", identityHashCode()এখনও সবার জন্য একই নয়।

এখন এই লাইনটি uncomment করার চেষ্টা করুন // mango2 = "mang";এবং এটিকে আবার চালানোর জন্য আপনি দেখতে পাবেন যে তিনটিই identityHashCode()আলাদা। হুম এটি সহায়ক ইঙ্গিত

আমরা জানি যে যদি hashcode(x)=Nএবং hashcode(y)=N=>x is equal to y

জাভা অভ্যন্তরীণভাবে কীভাবে কাজ করে তা আমি নিশ্চিত নই তবে আমি ধরেই নিয়েছি যে এটি ঘটেছে:

mango = "mango";

জাভা একটি স্ট্রিং নির্মিত "mango"যা উল্লেখ হয়েছিল (রেফারেন্সড) পরিবর্তনশীল দ্বারা mangoভালো কিছু

mango ----> "mango"

এখন পরের লাইনে যখন আমি বলেছিলাম:

mango2 = "mango";

এটি প্রকৃতপক্ষে একই স্ট্রিংটিকে পুনরায় ব্যবহার করেছে "mango"যা দেখে মনে হচ্ছে এটি

mango ----> "mango" <---- mango2

আম এবং আম দুটোই একই রেফারেন্সের দিকে ইঙ্গিত করছে এখন যখন আমি বললাম

mango3 = new String("mango")

এটি আসলে "আমের" জন্য সম্পূর্ণ নতুন রেফারেন্স (স্ট্রিং) তৈরি করেছে। যা দেখতে এরকম কিছু দেখাচ্ছে,

mango -----> "mango" <------ mango2

mango3 ------> "mango"

এবং এই কারণেই যখন আমি মূল্যবোধগুলি রাখি তখন mango == mango2তা প্রকাশিত হয় true। এবং যখন আমি এর জন্য মানটি রেখে দিই mango3 == mango2, তখন এটি বেরিয়ে যায় false(মানগুলি যখন একই ছিল)।

এবং আপনি যখন লাইনটি uncommented করেছেন // mango2 = "mang"; এটি প্রকৃতপক্ষে একটি স্ট্রিং "ম্যাং" তৈরি করেছে যা আমাদের গ্রাফটিকে এভাবে পরিবর্তন করে:

mango ---->"mango"
mango2 ----> "mang"
mango3 -----> "mango"

এই কারণেই পরিচয় হ্যাশকোড সবার জন্য এক নয়।

আশা করি এটি আপনাকে সাহায্য করবে। আসলে, আমি একটি পরীক্ষার কেস তৈরি করতে চেয়েছিলাম যেখানে == ব্যর্থ হয় এবং সমান () পাস করে। দয়া করে বিনা দ্বিধায় মন্তব্য করুন এবং যদি আমার ভুল হয় তবে আমাকে জানান।


mango == mango2আপনি কি mango2 নতুন স্ট্রিং অবজেক্ট হিসাবে তৈরি করেননি এবং এর পরিবর্তে সরাসরি সরাসরি উল্লেখ করা হয়েছে বলেই কি ঘটছে "mango"?
বিআরটি

1
== এবং সমান উপর সন্দেহগুলি পরিষ্কার করার জন্য স্ট্রিংয়ের ভুল উদাহরণ, স্ট্রিং যখন নতুন সাথে ব্যবহার করা হয় না তখন স্ট্রিং পুলে রাখা হয় এবং যখনই একই স্ট্রিংটি নতুন রেফারেন্সে বরাদ্দ করা হয় তখন এটি পুলে একই স্ট্রিংকে নির্দেশ করে। সুতরাং সম্ভবত == এবং .equals () তুলনার জন্য কিছু কাস্টম অবজেক্ট ব্যবহার করুন।
om252345

30

== কিনা দুটি ভেরিয়েবল অপারেটর পরীক্ষা আছে (একটি মেমরি ঠিকানায় পয়েন্টার ওরফে) একই রেফারেন্স

String foo = new String("abc");
String bar = new String("abc");

if(foo==bar)
// False (The objects are not the same)

bar = foo;

if(foo==bar)
// True (Now the objects are the same)

যেখানে সমান () পদ্ধতি পরীক্ষা দুটি ভেরিয়েবল বস্তু আছে পড়ুন কিনা একই রাজ্য (মান)

String foo = new String("abc");
String bar = new String("abc");

if(foo.equals(bar))
// True (The objects are identical but not same)

চিয়ার্স :-)


1
ভুল। যদি (foo == বার) এটি মিথ্যা নয় সত্য হওয়া উচিত। এটি একই স্ট্রিং "অ্যাডিসি" পুনরায় ব্যবহার করবে। এটি একটি স্যান্ডবক্সে পরীক্ষা করুন, এটি উভয়ের ক্ষেত্রেই সত্য ফিরে আসবে।
জননাথান লোগান

2
@ জোনাথনলোগান আমার ধারণা এই স্ট্রিং ইন্টার্নিংয়ের কারণে। এখন আমি "নতুন স্ট্রিং (" এবিসি ")" তে পরিবর্তিত হয়েছি। আশা করি এখন আর কোনও সমস্যা হবে না। জানানোর জন্য ধন্যবাদ।
মোহনরাজ বালাসুব্রামণিয়াম

13

কাস্টম ক্লাসগুলির সাথে এটি ব্যবহার করতে আপনাকে সমান ফাংশনটি (অন্যদের সাথে) ওভাররাইড করতে হবে।

সমান পদ্ধতিটি বস্তুর তুলনা করে।

==বাইনারি অপারেটর মেমরি অ্যাড্রেস তুলনা করা হয়।


8

উভয় == এবং .equals () একই জিনিসকে বোঝায় যদি আপনি .equals () কে ওভাররাইড না করেন।

আপনি একবার .equals () ওভাররাইড করে আপনি যা করতে চান এটি আপনার ইচ্ছা। আপনি ইনভোকেজ অবজেক্টের রাজ্যের সাথে অবজেক্টের অবস্থার সাথে উত্তীর্ণের তুলনা করতে পারেন বা আপনি কেবল সুপার.এক্কালসকে কল করতে পারেন ()


7

==একটি অপারেটর এবং equals()একটি পদ্ধতি

অপারেটরগুলি সাধারণত আদিম ধরণের তুলনার ==জন্য ব্যবহৃত হয় এবং এভাবে মেমরি ঠিকানার তুলনা equals()করার জন্য ব্যবহৃত হয় এবং অবজেক্টগুলির তুলনা করার জন্য পদ্ধতিটি ব্যবহৃত হয় ।


6
 String w1 ="Sarat";
 String w2 ="Sarat";
 String w3 = new String("Sarat");

 System.out.println(w1.hashCode());   //3254818
 System.out.println(w2.hashCode());   //3254818
 System.out.println(w3.hashCode());   //3254818

 System.out.println(System.identityHashCode(w1)); //prints 705927765
 System.out.println(System.identityHashCode(w2)); //prints 705927765
 System.out.println(System.identityHashCode(w3)); //prints 366712642


 if(w1==w2)   //  (705927765==705927765)
 {
   System.out.println("true");
 }
 else
 {
   System.out.println("false");
 }
 //prints true

 if(w2==w3)   //  (705927765==366712642)
 {
   System.out.println("true");
 }
 else
 {
   System.out.println("false");
 }
 //prints false


 if(w2.equals(w3))   //  (Content of 705927765== Content of 366712642)
 {
   System.out.println("true");
 }
 else
 {
   System.out.println("false");
 }
 //prints true

সহজ এবং সর্বোত্তম ব্যাখ্যা
শ্রিতাম জগদেব

5

কেবল মনে রাখবেন যে .equals(...)ক্লাসটি আপনি তুলনা করার চেষ্টা করছেন তা প্রয়োগ করা উচিত। অন্যথায়, একটি বিন্দু অনেক না; বস্তু শ্রেণীর জন্য পদ্ধতির সংস্করণ তুলনা অপারেশনের মতো একই কাজ করে: অবজেক্ট # সমান

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

enum FooEnum {A, B, C}

আপনি এর একটির বেশি উদাহরণস্বরূপ হবে না Aএকটি সময়ে, এবং একই Bএবং C। এর অর্থ হ'ল আপনি আসলে এর মতো একটি পদ্ধতি লিখতে পারেন:

public boolean compareFoos(FooEnum x, FooEnum y)
{
    return (x == y);
}

এবং আপনার যা কিছু সমস্যা হবে না।


4

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

    String s1 = new String("Ali");
    String s2 = new String("Veli");
    String s3 = new String("Ali");

    System.out.println(s1.hashCode());
    System.out.println(s2.hashCode());
    System.out.println(s3.hashCode());


    System.out.println("(s1==s2):" + (s1 == s2));
    System.out.println("(s1==s3):" + (s1 == s3));


    System.out.println("s1.equals(s2):" + (s1.equals(s2)));
    System.out.println("s1.equal(s3):" + (s1.equals(s3)));


    /*Output 
    96670     
    3615852
    96670
    (s1==s2):false
    (s1==s3):false
    s1.equals(s2):false
    s1.equal(s3):true
    */

4

relational operator ==এবং এর মধ্যে পার্থক্যের জন্য এখানে নিয়মের একটি সাধারণ থাম্ব রয়েছে the method .equals()

object1 == object2অবজেক্ট 1 এবং অবজেক্ট 2 দ্বারা রেফারেন্স করা অবজেক্টগুলি হিপে একই মেমরি অবস্থানের সাথে তুলনা করলে তুলনা করে ।

object1.equals(object2)বস্তু 1 এবং অবজেক্ট 2 এর মানগুলির তুলনা করে তারা মেমরিতে কোথায় রয়েছে তা নির্বিশেষে

স্ট্রিং ব্যবহার করে এটি ভাল প্রদর্শিত হতে পারে

দৃশ্যপট 1

 public class Conditionals {

    public static void main(String[] args) {
       String str1 = "Hello";
       String str2 = new String("Hello");
       System.out.println("is str1 == str2 ? " + (str1 == str2 ));
       System.out.println("is str1.equals(str2) ? " + (str1.equals(str2 )));
    }

 }



The result is
      is str1 == str2 ? false
      is str1.equals(str2) ? true 

দৃশ্য 2

public class Conditionals {

    public static void main(String[] args) {
       String str1 = "Hello";
       String str2 = "Hello";
       System.out.println("is str1 == str2 ? " + (str1 == str2 ));
       System.out.println("is str1.equals(str2) ? " + (str1.equals(str2 )));
    }

}

The result is 
  is str1 == str2 ? true
  is str1.equals(str2) ? true

এই স্ট্রিং তুলনাটি অন্য ধরণের অবজেক্টের সাথে তুলনা করার জন্য ভিত্তি হিসাবে ব্যবহৃত হতে পারে।

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

সুতরাং ব্যক্তি বস্তু তৈরি person1 and person2এবং এই দুটি তুলনা করার জন্য .equals()আমি ব্যবহার করে ব্যক্তি শ্রেণির সমান পদ্ধতিটি ওভাররাইড করতে হবে যা সংখ্যার ভেরিয়েবল (উচ্চতা বা ওজন) তুলনা হবে তার উপর ভিত্তি করে নির্ধারণ করতে

যাইহোক, == operator will still return results based on the memory location of the two objects(person1 and person2)

এই ব্যক্তির বস্তু তুলনা সাধারণকরণের স্বাচ্ছন্দ্যের জন্য, আমি নিম্নলিখিত পরীক্ষার শ্রেণি তৈরি করেছি। এই ধারণাগুলির উপর পরীক্ষা-নিরীক্ষা করলে অনেকগুলি সত্য প্রকাশিত হবে

package com.tadtab.CS5044;

public class Person {

private double height;
private double weight;

public double getHeight() {
    return height;
}

public void setHeight(double height) {
    this.height = height;
}

public double getWeight() {
    return weight;
}

public void setWeight(double weight) {
    this.weight = weight;
}


@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    long temp;
    temp = Double.doubleToLongBits(height);
    result = prime * result + (int) (temp ^ (temp >>> 32));
    return result;
}

@Override
/**
 * This method uses the height as a means of comparing person objects.
 * NOTE: weight is not part of the comparison criteria
 */
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Person other = (Person) obj;
    if (Double.doubleToLongBits(height) != Double.doubleToLongBits(other.height))
        return false;
    return true;
}

public static void main(String[] args) {

    Person person1 = new Person();
    person1.setHeight(5.50);
    person1.setWeight(140.00);

    Person person2 = new Person();
    person2.setHeight(5.70);
    person2.setWeight(160.00);

    Person person3 = new Person();
    person3 = person2;

    Person person4 = new Person();
    person4.setHeight(5.70);

    Person person5 = new Person();
    person5.setWeight(160.00);

    System.out.println("is person1 == person2 ? " + (person1 == person2)); // false;
    System.out.println("is person2 == person3 ? " + (person2 == person3)); // true 
    //this is because perosn3 and person to refer to the one person object in memory. They are aliases;
    System.out.println("is person2.equals(person3) ? " + (person2.equals(person3))); // true;

    System.out.println("is person2.equals(person4) ? " + (person2.equals(person4))); // true;

    // even if the person2 and person5 have the same weight, they are not equal.
    // it is because their height is different
    System.out.println("is person2.equals(person4) ? " + (person2.equals(person5))); // false;
}

}

এই শ্রেণীর মৃত্যুদন্ড কার্যকর করার ফলাফল:

is person1 == person2 ? false
is person2 == person3 ? true
is person2.equals(person3) ? true
is person2.equals(person4) ? true
is person2.equals(person4) ? false

3

এছাড়াও নোট করুন যে .equals()সাধারণত ==টেস্টিংয়ের জন্য অন্তর্ভুক্ত থাকে কারণ আপনি দুটি জিনিস সমান কিনা তা পরীক্ষা করতে চান এটির জন্য আপনি প্রথম পরীক্ষা করতে চান।

এবং ==প্রকৃতপক্ষে আদিম ধরণের মানগুলির দিকে নজর দেয়, বস্তুর জন্য এটি রেফারেন্সটি পরীক্ষা করে।


3

== অপারেটর সর্বদা রেফারেন্স তুলনা করা হয়। তবে ক্ষেত্রে

সমান () পদ্ধতি

এটি প্রয়োগের উপর নির্ভর করে যদি আমরা ওভাররাইড করা পদ্ধতিতে প্রদত্ত বাস্তবায়নের মৌলিক বিষয়ের সাথে তুলনা করার চেয়ে সমান পদ্ধতির সমান হয়।

 class A
 {
   int id;
   String str;

     public A(int id,String str)
     {
       this.id=id;
       this.str=str;
     }

    public static void main(String arg[])
    {
      A obj=new A(101,"sam");
      A obj1=new A(101,"sam");

      obj.equals(obj1)//fasle
      obj==obj1 // fasle
    }
 }

উপরের কোডে উভয় আপত্তি এবং আপত্তি 1 অবজেক্টে একই ডেটা রয়েছে তবে রেফারেন্স একই নয় তাই মিথ্যা এবং == ফেরতের সমান হয়। তবে আমরা যদি এর চেয়ে সমান পদ্ধতিটিকে ওভাররাইড করি

 class A
 {
   int id;
   String str;

     public A(int id,String str)
     {
       this.id=id;
       this.str=str;
     }
    public boolean equals(Object obj)
    {
       A a1=(A)obj;
      return this.id==a1.id;
    }

    public static void main(String arg[])
    {
      A obj=new A(101,"sam");
      A obj1=new A(101,"sam");

      obj.equals(obj1)//true
      obj==obj1 // fasle
    }
 }

জানি যে এটি সত্য এবং মিথ্যা একই ক্ষেত্রে ফিরে আসবে কেবলমাত্র আমরা বাতিল হয়েছি

সমান পদ্ধতি।

এটি বস্তুর মূল বিষয়বস্তু (আইডি) এর সাথে বস্তুর তুলনা করে

তবে ==

এখনও অবজেক্টের রেফারেন্স তুলনা করুন।


3

== এবং সমান () এর মধ্যে প্রধান পার্থক্য

1) == আদিমদের তুলনা করতে ব্যবহৃত হয়।

উদাহরণ স্বরূপ :

        String string1 = "Ravi";
        String string2 = "Ravi";
        String string3 = new String("Ravi");
        String string4 = new String("Prakash");

        System.out.println(string1 == string2); // true because same reference in string pool
        System.out.println(string1 == string3); // false

2) সমান () বস্তুর তুলনা করতে ব্যবহৃত হয়। উদাহরণ স্বরূপ :

        System.out.println(string1.equals(string2)); // true equals() comparison of values in the objects
        System.out.println(string1.equals(string3)); // true
        System.out.println(string1.equals(string4)); // false

2

==অনেকগুলি অবজেক্টের ধরণের ক্ষেত্রে ব্যবহার করা যেতে পারে তবে আপনি যে Object.equalsকোনও প্রকারের জন্য বিশেষত স্ট্রিংস এবং গুগল ম্যাপ মার্কার ব্যবহার করতে পারেন ।


2
public class StringPool {

public static void main(String[] args) {

    String s1 = "Cat";// will create reference in string pool of heap memory
    String s2 = "Cat";
    String s3 = new String("Cat");//will create a object in heap memory

    // Using == will give us true because same reference in string pool

    if (s1 == s2) {
        System.out.println("true");
    } else {
        System.out.println("false");
    }

    // Using == with reference and Object will give us False

    if (s1 == s3) {
        System.out.println("true");
    } else {
        System.out.println("false");
    }

    // Using .equals method which refers to value

    if (s1.equals(s3)) {
        System.out.println("true");
    } else {
        System.out.println("False");
    }

    }
  }

---- আউটপুট ----- সত্য মিথ্যা সত্য


2

এটি যোগ করার মতো হতে পারে যে আদিম প্রকারের জন্য মোড়কের জিনিসগুলির জন্য - যেমন আন্ত, দীর্ঘ, ডাবল - == দুটি মান সমান হলে সত্যটি ফিরে আসবে।

Long a = 10L;
Long b = 10L;

if (a == b) {
    System.out.println("Wrapped primitives behave like values");
}

বিপরীতে, উপরোক্ত দুটি লং দুটি পৃথক পৃথক অ্যারেলিস্টে স্থাপন করা সমান হিসাবে তাদের দেখায় তবে == হয় না।

ArrayList<Long> c = new ArrayList<>();
ArrayList<Long> d = new ArrayList<>();

c.add(a);
d.add(b);
if (c == d) System.out.println("No way!");
if (c.equals(d)) System.out.println("Yes, this is true.");

আদিম ধরণের জন্য মোড়কের বস্তুগুলি - যেমন পূর্ণসংখ্যার, লম্বা, ডাবল == দুটি মান সমান হলেও সত্য হতে পারে না। এটি খাঁটিভাবে র্যাপারের ক্যাশে নির্ভর করে। নীচের কোডটি মিথ্যা মুদ্রণ করবে কারণ ডিফল্ট ক্যাশে -128 থেকে 127 এর মধ্যে সীমাবদ্ধ রয়েছে Long a = 128l; Long b = 128l; System.out.println(a == b);
নীতেশ ভরদ্বাজ

1

স্ট্রিং পুকুর (ওরফে interning ) এবং পূর্ণসংখ্যা পুকুর দাগ আরও পার্থক্য, এবং আপনি ব্যবহার করতে অনুমতি দিতে পারে ==পরিবর্তে কিছু ক্ষেত্রে অবজেক্টের জন্য.equals

এটি বৃহত্তর জটিলতার ব্যয়ে আপনাকে বৃহত্তর কর্মক্ষমতা (?) দিতে পারে।

উদাহরণ:

assert "ab" == "a" + "b";

Integer i = 1;
Integer j = i;
assert i == j;

জটিলতা ট্রেড অফ: নিম্নলিখিতগুলি আপনাকে বিস্মিত করতে পারে:

assert new String("a") != new String("a");

Integer i = 128;
Integer j = 128;
assert i != j;

আমি আপনাকে এই জাতীয় মাইক্রো-অপ্টিমাইজেশান থেকে দূরে থাকুন এবং সর্বদা.equals অবজেক্ট এবং ==আদিমদের জন্য ব্যবহার করার পরামর্শ দিচ্ছি :

assert (new String("a")).equals(new String("a"));

Integer i = 128;
Integer j = 128;
assert i.equals(j);

1

সংক্ষেপে, উত্তরটি "হ্যাঁ"।

জাভাতে ==অপারেটর দুটি বস্তুর সাথে একই মেমরি অবস্থানের দিকে নির্দেশ করে কিনা তা তুলনা করে; যখন .equals()তারা যদি একই বস্তুর মূল্য আছে দেখতে পদ্ধতি আসলে দুটি বস্তুর তুলনা করা হয়।


0

মূলত, == দুটি বস্তুর সাথে যদি একই স্তরের রেফারেন্স থাকে তবে তুলনা করুন, সুতরাং যদি না দুটি রেফারেন্স একই অবজেক্টের সাথে লিঙ্ক না করা হয় তবে এই তুলনাটি মিথ্যা হবে।

equals()Objectশ্রেণি থেকে উত্তরাধিকারসূত্রে প্রাপ্ত একটি পদ্ধতি । এই পদ্ধতিটি ডিফল্টরূপে তুলনা করে যদি দুটি বস্তুর একই রেফারেস থাকে। এর অর্থ:

object1.equals(object2) <=> object1 == object2

তবে, যদি আপনি একই শ্রেণীর দুটি বস্তুর মধ্যে সমতা প্রতিষ্ঠা করতে চান তবে আপনার এই পদ্ধতিটি ওভাররাইড করা উচিত। hashCode()আপনার যদি ওভারড্রেন থাকে তবে পদ্ধতিটি ওভাররাইড করা খুব গুরুত্বপূর্ণequals()

hashCode()সাম্য প্রতিষ্ঠার সময় প্রয়োগ করা জাভা অবজেক্ট চুক্তির একটি অংশ। আপনি যদি সংগ্রহগুলি নিয়ে কাজ করে থাকেন এবং আপনি বাস্তবায়ন না করেন তবে hashCode()অদ্ভুত খারাপ জিনিসগুলি ঘটতে পারে:

HashMap<Cat, String> cats = new HashMap<>();
Cat cat = new Cat("molly");
cats.put(cat, "This is a cool cat");
System.out.println(cats.get(new Cat("molly"));

nullআপনি যদি প্রয়োগ না করেন তবে পূর্ববর্তী কোডটি কার্যকর করার পরে মুদ্রণ করা হবে hashCode()


0

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

জাভাতে == এবং সমান মধ্যে প্রধান পার্থক্য হ'ল "==" আদিমদের তুলনা করতে ব্যবহৃত হয় যখন বস্তুর সাম্যতা পরীক্ষা করার জন্য সমান () পদ্ধতিটি সুপারিশ করা হয়।

স্ট্রিং তুলনা == এবং সমান পদ্ধতি উভয়ই ব্যবহারের একটি সাধারণ দৃশ্য। যেহেতু java.lang. স্ট্রিং ক্লাস ওভাররাইড পদ্ধতির সমান, এটি দুটি ক্ষেত্রে স্ট্রিং অবজেক্টে একই বিষয়বস্তু থাকলে সত্য হয় তবে == কেবল তখনই সত্য ফিরে আসবে যদি দুটি রেফারেন্স একই বস্তুর দিকে নির্দেশ করে থাকে।

এখানে == এবং সমান () পদ্ধতির সাহায্যে জাভাতে দুটি স্ট্রিংয়ের তুলনা করার উদাহরণ যা কিছু সন্দেহ দূর করবে:

public class TEstT{

    public static void main(String[] args) {

String text1 = new String("apple");
String text2 = new String("apple");

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

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

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

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