আমি যদি এটি সঠিকভাবে বুঝতে পারি তবে আমি স্পষ্ট করতে চেয়েছিলাম:
==
একটি রেফারেন্স তুলনা, অর্থাৎ উভয় বস্তু একই মেমরি অবস্থানের দিকে নির্দেশ করে point.equals()
বস্তুর মধ্যে মানের তুলনা মূল্যায়ন
.equals()
আমি যদি এটি সঠিকভাবে বুঝতে পারি তবে আমি স্পষ্ট করতে চেয়েছিলাম:
==
একটি রেফারেন্স তুলনা, অর্থাৎ উভয় বস্তু একই মেমরি অবস্থানের দিকে নির্দেশ করে point.equals()
বস্তুর মধ্যে মানের তুলনা মূল্যায়ন.equals()
উত্তর:
সাধারণভাবে, আপনার প্রশ্নের উত্তর "হ্যাঁ", তবে ...
.equals(...)
এটি যা তুলনা করতে লেখা হয়েছে তা কেবল তার সাথে তুলনা করবে, আর বেশি নয়, কমও নয়।equals(Object o)
নিকটতম অভিভাবক শ্রেণীর পদ্ধতির ডিফল্ট যা এই পদ্ধতিটিকে ওভাররাইড করে।Object#equals(Object o)
পদ্ধতিটি রেখে চলেছেন । অবজেক্ট এপিআই অনুসারে এটি সমান ==
; এটি হ'ল, যদি সত্য হয় এবং কেবলমাত্র যদি উভয় ভেরিয়েবল একই বস্তুকে উল্লেখ করে, যদি তাদের উল্লেখগুলি একই এবং একই হয়। সুতরাং আপনি অবজেক্টের সমতার জন্য পরীক্ষা করছেন এবং কার্যকরী সমতার জন্য নয় ।hashCode
আপনি ওভাররাইড করলে সর্বদা ওভাররাইড মনে রাখবেন equals
। এপিআই অনুসারে, hashCode()
দুটি বস্তুর জন্য পদ্ধতি থেকে ফিরে আসা ফলাফলটি একই হতে হবে যদি তাদের equals
পদ্ধতিগুলি সমতুল্য হয় তা দেখায়। বিপরীত না অগত্যা সত্য।==
মেমরির রেফারেন্সের জন্য পরীক্ষা করে থাকে তবে আমি কেন [এই] [1] [1]: docs.google.com/docament/d/… এ এই অদ্ভুত আচরণ পাচ্ছি? আশা করি আউটপুটটি সত্য হবে। আমার বিভ্রান্তি দূর করতে পারে
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 / জাভাসে / / / ডকস / এপি / জাভা / আংল্যাঙ্গ )
স্ট্রিং ক্লাসের প্রতি শ্রদ্ধা সহ:
সমান () পদ্ধতিটি স্ট্রিং উদাহরণগুলির (হিপগুলিতে) "মান" এর সাথে তুলনা করে নির্বিশেষে যদি দুটি বস্তুর রেফারেন্স একই স্ট্রিং উদাহরণকে উল্লেখ করে বা না করে। স্ট্রিং টাইপের যে কোনও দুটি অবজেক্টের রেফারেন্স যদি একই স্ট্রিং ইনস্ট্যান্সের উল্লেখ করে তবে দুর্দান্ত! যদি দুটি অবজেক্টের রেফারেন্স দুটি ভিন্ন স্ট্রিং দৃষ্টান্তগুলিকে উল্লেখ করে .. এটি কোনও পার্থক্য করে না। এটি প্রতিটি স্ট্রিং উদাহরণের সাথে "মান" (এটি: অক্ষরের অ্যারের সামগ্রীগুলি) যা তুলনা করা হচ্ছে।
অন্যদিকে, "==" অপারেটর দুটি স্ট্রিং উদাহরণের সাথে একই উল্লেখ করে কিনা তা দেখতে দুটি অবজেক্টের রেফারেন্সের মান তুলনা করে । যদি উভয় অবজেক্টের রেফারেন্সের মান একই স্ট্রিং ইনস্ট্যান্সের "রেফার" করে তবে বুলিয়ান এক্সপ্রেশনের ফলাফলটি "সত্য" হবে .. ডু। অন্যদিকে, উভয় অবজেক্টের রেফারেন্সের মান বিভিন্ন স্ট্রিং দৃষ্টান্তগুলিকে "উল্লেখ করে" (যদিও উভয় স্ট্রিংয়ের উদাহরণগুলির মধ্যে একই "মান" রয়েছে, অর্থাত, প্রতিটি স্ট্রিং উদাহরণের অক্ষরের অ্যারের সামগ্রীগুলি একই হয়) বুলিয়ান এক্সপ্রেশন ফলাফল "মিথ্যা" হবে।
কোনও ব্যাখ্যা হিসাবে, এটি ডুবে যাক।
আমি আশা করি এটি কিছুটা সাফ করে দেয়।
String
S, ==
রেফারেন্স হিসেবে ভাল সমান, হ্যাঁ, কিন্তু এটা সাধারণত (দুই হিসেবে কাজ করে String
একই বিষয়বস্তুর গুলি করবে সাধারণত হতে ==
কারণ কিভাবে জাভা হ্যান্ডলগুলি, একে অপরের সাথে) String
গুলি। এটি সবসময় হবে না এবং এটি অবশ্যই খারাপ অভ্যাস, তবে এটি একটি সাধারণ ভুল, বিশেষত অন্য ভাষা থেকে আসা লোকদের।
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
মিথ্যা ফিরে আসবে।
আপনি "আদিম" বা "অবজেক্টের ধরণের" কথা বলছেন কিনা তা নির্ভর করে কিছু ছোট পার্থক্য রয়েছে; আপনি যদি "স্ট্যাটিক" বা "অ-স্থিতিশীল" সদস্যদের বিষয়ে কথা বলছেন তবে একই কথা বলা যেতে পারে; আপনি উপরের সমস্ত মিশ্রণ করতে পারেন ...
এখানে একটি উদাহরণ (আপনি এটি চালাতে পারেন):
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 শ্রেণিতে পদ্ধতি) এর জন্য ব্যাখ্যাগুলি তুলনা করতে পারেন:
== এবং এর সমান পার্থক্য আমাকে কিছুক্ষণের জন্য বিভ্রান্ত করেছিল যতক্ষণ না আমি এটিকে আরও ঘনিষ্ঠভাবে দেখার সিদ্ধান্ত নিই। তাদের মধ্যে অনেকে বলেছেন যে স্ট্রিংয়ের তুলনা করার জন্য আপনার ব্যবহার করা উচিত 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"
?
== কিনা দুটি ভেরিয়েবল অপারেটর পরীক্ষা আছে (একটি মেমরি ঠিকানায় পয়েন্টার ওরফে) একই রেফারেন্স ।
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)
চিয়ার্স :-)
কাস্টম ক্লাসগুলির সাথে এটি ব্যবহার করতে আপনাকে সমান ফাংশনটি (অন্যদের সাথে) ওভাররাইড করতে হবে।
সমান পদ্ধতিটি বস্তুর তুলনা করে।
==
বাইনারি অপারেটর মেমরি অ্যাড্রেস তুলনা করা হয়।
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
কেবল মনে রাখবেন যে .equals(...)
ক্লাসটি আপনি তুলনা করার চেষ্টা করছেন তা প্রয়োগ করা উচিত। অন্যথায়, একটি বিন্দু অনেক না; বস্তু শ্রেণীর জন্য পদ্ধতির সংস্করণ তুলনা অপারেশনের মতো একই কাজ করে: অবজেক্ট # সমান ।
আপনি যখনই এনামগুলির সাথে তুলনা করছেন তখন কেবলমাত্র যখন আপনি বস্তুর জন্য তুলনা অপারেটরটি ব্যবহার করতে চান কেবলমাত্র তা একবার। এটি হ'ল একবারে এনাম মানটির একমাত্র উদাহরণ রয়েছে। উদাহরণস্বরূপ, এনাম দেওয়া
enum FooEnum {A, B, C}
আপনি এর একটির বেশি উদাহরণস্বরূপ হবে না A
একটি সময়ে, এবং একই B
এবং C
। এর অর্থ হ'ল আপনি আসলে এর মতো একটি পদ্ধতি লিখতে পারেন:
public boolean compareFoos(FooEnum x, FooEnum y)
{
return (x == y);
}
এবং আপনার যা কিছু সমস্যা হবে না।
আপনি কোডটি মূল্যায়ন করলে এটি খুব স্পষ্ট যে (==) মেমরি ঠিকানার সাথে তুলনা করে, যখন সমান (অবজেক্ট ও) উদাহরণগুলির হ্যাশকোড () এর সাথে তুলনা করে। এ কারণেই বলা হয়ে থাকে যে আপনি যদি পরে আশ্চর্যের মুখোমুখি না হন তবে সমান () এবং হ্যাশকোড () এর মধ্যে চুক্তি ভঙ্গ করবেন না।
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
*/
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
== অপারেটর সর্বদা রেফারেন্স তুলনা করা হয়। তবে ক্ষেত্রে
সমান () পদ্ধতি
এটি প্রয়োগের উপর নির্ভর করে যদি আমরা ওভাররাইড করা পদ্ধতিতে প্রদত্ত বাস্তবায়নের মৌলিক বিষয়ের সাথে তুলনা করার চেয়ে সমান পদ্ধতির সমান হয়।
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
}
}
জানি যে এটি সত্য এবং মিথ্যা একই ক্ষেত্রে ফিরে আসবে কেবলমাত্র আমরা বাতিল হয়েছি
সমান পদ্ধতি।
এটি বস্তুর মূল বিষয়বস্তু (আইডি) এর সাথে বস্তুর তুলনা করে
তবে ==
এখনও অবজেক্টের রেফারেন্স তুলনা করুন।
== এবং সমান () এর মধ্যে প্রধান পার্থক্য
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
==
অনেকগুলি অবজেক্টের ধরণের ক্ষেত্রে ব্যবহার করা যেতে পারে তবে আপনি যে Object.equals
কোনও প্রকারের জন্য বিশেষত স্ট্রিংস এবং গুগল ম্যাপ মার্কার ব্যবহার করতে পারেন ।
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");
}
}
}
---- আউটপুট ----- সত্য মিথ্যা সত্য
এটি যোগ করার মতো হতে পারে যে আদিম প্রকারের জন্য মোড়কের জিনিসগুলির জন্য - যেমন আন্ত, দীর্ঘ, ডাবল - == দুটি মান সমান হলে সত্যটি ফিরে আসবে।
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.");
Long a = 128l; Long b = 128l; System.out.println(a == b);
স্ট্রিং পুকুর (ওরফে 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);
সংক্ষেপে, উত্তরটি "হ্যাঁ"।
জাভাতে ==
অপারেটর দুটি বস্তুর সাথে একই মেমরি অবস্থানের দিকে নির্দেশ করে কিনা তা তুলনা করে; যখন .equals()
তারা যদি একই বস্তুর মূল্য আছে দেখতে পদ্ধতি আসলে দুটি বস্তুর তুলনা করা হয়।
মূলত, ==
দুটি বস্তুর সাথে যদি একই স্তরের রেফারেন্স থাকে তবে তুলনা করুন, সুতরাং যদি না দুটি রেফারেন্স একই অবজেক্টের সাথে লিঙ্ক না করা হয় তবে এই তুলনাটি মিথ্যা হবে।
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()
।
যেহেতু জাভা অপারেটর ওভারলোডিং সমর্থন করে না, == প্রতিটি বস্তুর জন্য অভিন্ন আচরণ করে তবে সমান () পদ্ধতি যা জাভাতে ওভাররাইড করা যেতে পারে এবং ব্যবসার নিয়মের উপর ভিত্তি করে অবজেক্টগুলির তুলনা করার জন্য যুক্তি পরিবর্তন করা যেতে পারে।
জাভাতে == এবং সমান মধ্যে প্রধান পার্থক্য হ'ল "==" আদিমদের তুলনা করতে ব্যবহৃত হয় যখন বস্তুর সাম্যতা পরীক্ষা করার জন্য সমান () পদ্ধতিটি সুপারিশ করা হয়।
স্ট্রিং তুলনা == এবং সমান পদ্ধতি উভয়ই ব্যবহারের একটি সাধারণ দৃশ্য। যেহেতু 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);
}
}