আমি জাভাতে স্ট্রিংগুলি কীভাবে তুলনা করব?


724

আমি ==আমার প্রোগ্রামটিতে অপারেটরটি এখনও পর্যন্ত আমার সমস্ত স্ট্রিংয়ের তুলনা করতে ব্যবহার করছি । যাইহোক, আমি একটি বাগের মধ্যে দৌড়ে গিয়েছিলাম, এর মধ্যে একটিতে পরিবর্তিত হয়েছি .equals()এবং এটি বাগটি স্থির করেছে।

কি ==খারাপ? কখন এবং এটি ব্যবহার করা উচিত নয়? পার্থক্য কি?


12
এটিও জেনে রাখা ভাল, আপনি .equals () পদ্ধতিটি যদি ওভাররিডিং করে থাকেন তবে নিশ্চিত করুন যে আপনি .hashcode () পদ্ধতিটি ওভাররাইড করছেন, অন্যথায় আপনি সমতা সম্পর্কিত সম্পর্ক বি / ডাব্লু সমান এবং হ্যাশকোড লঙ্ঘন করে শেষ করবেন। আরও তথ্যের জন্য জাভা ডক পড়ুন।
নাগেস্বরান

বিষয়গুলিতে কেন এটি ==কাজ করে সে সম্পর্কে আমার ব্যাখ্যাটির একটি লিঙ্ক রেখে : stackoverflow.com/a/19966154/2284641
জোহানেস এইচ।

==কিছুটা সময় কাজ করবে, যেহেতু জাভাতে একটি স্ট্রিং পুল রয়েছে, যেখানে এটি সাধারণত ব্যবহৃত স্ট্রিংগুলির মেমরি রেফারেন্সগুলি পুনরায় ব্যবহার করার চেষ্টা করে। তবে ==তুলনা করুন যে অবজেক্টগুলি সমান, মানগুলি নয় ... তাই .equals()আপনি ব্যবহার করতে চান সঠিক ব্যবহার।
জেমস ওরাভেক

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

উত্তর:


5558

== রেফারেন্স সমতার জন্য পরীক্ষাগুলি (সেগুলি একই বস্তু কিনা)।

.equals() মান সাম্যের জন্য পরীক্ষা (তারা যুক্তিযুক্তভাবে "সমান" কিনা) whether

অবজেক্টস.একুয়ালস ()null কল .equals()করার আগে চেক করে যাতে আপনার দরকার হয় না (জেডিকে of হিসাবে পাওয়া যায়, পেয়ারাতেও উপলভ্য )।

ফলস্বরূপ, আপনি যদি দুটি স্ট্রিংয়ের মান একই ব্যবহার করতে চান যা আপনি পরীক্ষা করতে চান তবে আপনি সম্ভবত ব্যবহার করতে চাইবেন Objects.equals()

// These two have the same value
new String("test").equals("test") // --> true 

// ... but they are not the same object
new String("test") == "test" // --> false 

// ... neither are these
new String("test") == new String("test") // --> false 

// ... but these are because literals are interned by 
// the compiler and thus refer to the same object
"test" == "test" // --> true 

// ... string literals are concatenated by the compiler
// and the results are interned.
"test" == "te" + "st" // --> true

// ... but you should really just call Objects.equals()
Objects.equals("test", new String("test")) // --> true
Objects.equals(null, "test") // --> false
Objects.equals(null, null) // --> true

আপনি প্রায় সর্বদা ব্যবহার করতে চান Objects.equals()। ইন বিরল অবস্থা যেখানে আপনি জানেন আপনি কার সাথে এসেছেন ডিলিং অন্তরীণ স্ট্রিং, আপনি করতে পারেন ব্যবহার==

জেএলএস থেকে 3.10.5। স্ট্রিং লিটারালস :

অধিকন্তু, একটি স্ট্রিং আক্ষরিক সর্বদা শ্রেণীর একই উদাহরণকে বোঝায় String। স্ট্রিং লিটারেলগুলি - বা আরও সাধারণভাবে স্ট্রিংগুলি ধ্রুবক এক্সপ্রেশনগুলির মূল্য ( .215.28 ) - "অভ্যন্তরীণ" হয় যাতে পদ্ধতিটি ব্যবহার করে অনন্য দৃষ্টান্তগুলি ভাগ করে নেওয়া যায় String.intern

অনুরূপ উদাহরণ জেএলএস 3.10.5-1 এও পাওয়া যাবে ।

অন্যান্য পদ্ধতি বিবেচনা করুন

String.equalsIgnoreCase () মান সমতা যা কেসকে উপেক্ষা করে।

স্ট্রিং.কন্টেন্টএকুয়ালস () জাভাটির Stringসামগ্রীর সাথে যেকোন বিষয়বস্তুর সাথে তুলনা করে CharSequence(জাভা ০.৫ থেকে পাওয়া যায়)। সাম্যতা তুলনা করার আগে আপনার স্ট্রিংবাফার ইত্যাদি স্ট্রিংয়ে পরিণত করা থেকে বাঁচায়, তবে নাল পরীক্ষা করা আপনার কাছে ছেড়ে দেয়।


3
যদি == রেফারেন্সের সমতার জন্য পরীক্ষা করে কেন এন == 5 অর্থবোধ করে? 5 কোনও পরিবর্তনশীল নয়
হৃত রায়

2
পছন্দ ==করেছেন একটি ভেরিয়েবলের মান । আপনার যখন কোনও অবজেক্ট থাকে তখন ভেরিয়েবল যা রেফারেন্সটিকে রেফারেন্স করে তা মান হিসাবে বস্তুর রেফারেন্স রাখে । সুতরাং, আপনি দুটি ভেরিয়েবলের সাথে তুলনা করার সময় রেফারেন্সগুলি তুলনা করুন ==। যখন কোনও আদিম উপাত্তের সাথে তুলনা করা যায় intতখনও এটি একই রকম। প্রকারের একটি ভেরিয়েবলের intমান হিসাবে পূর্ণসংখ্যা থাকে। সুতরাং, আপনি দুটি intব্যবহার করে এর মান তুলনা ==। যদি intকোনও ভেরিয়েবলের মান বা যাদুর সংখ্যার কোনও মূল্য থাকে না। উপরন্তু: একটি রেফারেন্স একটি সংখ্যা ছাড়া কিছুই নয় যা স্মৃতিকে বোঝায়।
আকুজমিনিখ

718

==বস্তুর রেফারেন্স .equals()পরীক্ষা করে, স্ট্রিংয়ের মানগুলি পরীক্ষা করে।

কখনও কখনও দেখে মনে হয় ==মানগুলির তুলনা করা হয়, কারণ জাভা কিছু অন-লাইনের স্ট্রিংগুলি একই জিনিস হ'ল নিশ্চিত করার জন্য পর্দার আড়ালে কিছু স্টাফ করে।

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

String fooString1 = new String("foo");
String fooString2 = new String("foo");

// Evaluates to false
fooString1 == fooString2;

// Evaluates to true
fooString1.equals(fooString2);

// Evaluates to true, because Java uses the same object
"bar" == "bar";

তবে নাল থেকে সাবধান!

==nullস্ট্রিংগুলি সূক্ষ্মভাবে পরিচালনা করে তবে .equals()নাল স্ট্রিং থেকে কল করা ব্যতিক্রম ঘটায়:

String nullString1 = null;
String nullString2 = null;

// Evaluates to true
System.out.print(nullString1 == nullString2);

// Throws a NullPointerException
System.out.print(nullString1.equals(nullString2));

সুতরাং যদি আপনি জানেন যে fooString1এটি শূন্য হতে পারে, তবে পাঠককে লিখুন

System.out.print(fooString1 != null && fooString1.equals("bar"));

নিম্নলিখিতগুলি সংক্ষিপ্ত, তবে এটি শূন্যের জন্য যাচাই করে নি এটি কম স্পষ্ট:

System.out.print("bar".equals(fooString1));  // "bar" is never null
System.out.print(Objects.equals(fooString1, "bar"));  // Java 7 required

86
কখনও কখনও দেখে মনে হয় "==" মানগুলির তুলনা করে - কর == do সর্বদা মানগুলির তুলনা করে ! (এটি কেবলমাত্র নির্দিষ্ট মানগুলিই রেফারেন্স!)
আইয়ুব

6
হায় আফসোস-এর জন্য কোনও স্থিতিশীল পদ্ধতি নেই, এবং অপারেটরগুলির কোনও কাস্টম ওভারলোডিং নেই, যা জাভা এই অংশটিকে সি # বা পাইথনের চেয়ে বেশি করে তোলে। এবং যেহেতু জাভাতে এক্সটেনশন পদ্ধতি নেই, আপনি জাভা.লাং.স্ট্রিং প্রসারিত করতে আপনার নিজস্ব ইউটিলিটি লিখতে পারবেন না। রাইট? স্ট্রিং সাবক্লাসিং সম্পর্কিত কোনও চিন্তা, সেই স্ট্যাটিক ইউটিলিটি পদ্ধতি যুক্ত করা, এবং তারপরে সর্বদা মাইস্ট্রিং ব্যবহার করা উচিত? নাল-নিরাপদ তুলনা করার জন্য দুটি প্যারামিটার সহ একটি স্থিতিশীল পদ্ধতিও সেই সাবক্লাসে খুব ভাল লাগবে।
জন কোম্বস

7
গ্রোভি নিরাপদ নেভিগেশন অপারেটর ( groovy.codehaus.org/… ) এর সাহায্যে এটিকে কিছুটা সহজ করে তোলে ?.। এটি nullString1?.equals(nullString2);সম্পূর্ণ নাল বিবৃতিতে রূপান্তরিত হবে। যাইহোক, আপনার কাছে থাকলে এটি কোনও validString?.equals(nullString);উপকারে আসে না - এটি এখনও একটি ব্যতিক্রম ছুঁড়ে দেয়।
চার্লস উড

5
জাভাতে nullable স্ট্রিং তুলনা করার জন্য ছোট পদ্ধতি: stackoverflow.com/questions/11271554/…
ভাদজিম

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

442

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

.equals() স্ট্রিংয়ের মানগুলির তুলনা করে।

কখনও কখনও ==নীচের ক্ষেত্রে যেমন স্ট্রিং মানগুলির তুলনা করার বিভ্রম দেয়:

String a="Test";
String b="Test";
if(a==b) ===> true

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

(a == খ) ===> সত্য

                       String Pool
     b -----------------> "test" <-----------------a

তবে, ==নিম্নলিখিত ক্ষেত্রে ব্যর্থ:

String a="test";
String b=new String("test");
if (a==b) ===> false

এই ক্ষেত্রে new String("test")স্টেটমেন্টের জন্য নতুন স্ট্রিংটি গাদাতে তৈরি করা হবে এবং সেই রেফারেন্সটি দেওয়া হবে b, সুতরাং bস্ট্রিং পুলে নয়, স্তূপের উপর একটি রেফারেন্স দেওয়া হবে।

এখন aস্ট্রিং পুলের bএকটি স্ট্রিংয়ের দিকে ইশারা করছে যখন হিপগুলিতে স্ট্রিংয়ের দিকে ইশারা করছে। যে কারণে আমরা পেতে:

যদি (a == খ) ===> মিথ্যা।

                String Pool
     "test" <-------------------- a

                   Heap
     "test" <-------------------- b

যদিও .equals()সবসময় তাই এটি উভয় ক্ষেত্রেই সত্য দেয় স্ট্রিং মান তুলনা:

String a="Test";
String b="Test";
if(a.equals(b)) ===> true

String a="test";
String b=new String("test");
if(a.equals(b)) ===> true

সুতরাং ব্যবহার .equals()সর্বদা ভাল।


3
.equals () দুটি উদাহরণের সাথে তুলনা করে তবে তাদের সাথে তুলনা করার জন্য সমান প্রয়োগ করা হয়। এটি হতে পারে বা স্ট্রুপের আউটপুটটির তুলনা করে না।
জ্যাকব

3
@ জ্যাকব অবজেক্ট ক্লাস .equals()পদ্ধতিটি উদাহরণ (রেফারেন্স / ঠিকানা) এর সাথে তুলনা করে যেখানে স্ট্রিং ক্লাসের .equals()পদ্ধতিগুলি বিষয়বস্তুর তুলনায় (চরগুলি) ওভাররাইড করা হয়
সত্যদেব

1
স্ট্রিং পুল বনাম জাভা হ্যাপ পার্থক্যগুলি দেখানো ভাল কারণ তারা অবশ্যই এক নয় । স্ট্রিংপুলে জাভা Stringমেমরির পদচিহ্নগুলি সংরক্ষণের জন্য "ক্যাশে" অবজেক্টগুলির চেষ্টা করে Stringযা অপরিবর্তনীয় বলে পরিচিত (আশা করি, আমি এখানে এটি সঠিকভাবে বলেছি)। এছাড়াও stackoverflow.com/questions/3052442/… দেখুন
রোল্যান্ড

1
এই উত্তরটি আমি খুঁজছিলাম।
ওয়েজি

কি দুর্দান্ত উত্তর!
alwbtc

223

দ্য ==অপারেটর চেক যদি দুটি স্ট্রিং ঠিক একই বস্তুর দেখতে।

.equals()যদি দুটি স্ট্রিং মান একই পদ্ধতি চেক করবে।


5
সাধারণত আমি দৃ ap়ভাবে অ্যাপাচি কমন্স লাইব্রেরিটি সুপারিশ করি: commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/… , java.lang.String)
মার্সিন এরবেল

178

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

স্ট্রিং তুলনার জন্য == অপারেটর ব্যবহার করার সময় আপনি স্ট্রিংয়ের বিষয়বস্তুর তুলনা করছেন না, তবে আসলে মেমরি ঠিকানার সাথে তুলনা করছেন। যদি তারা উভয়ই সমান হয় তবে তা সত্য এবং মিথ্যা প্রত্যাবর্তন করবে otherwise স্ট্রিংয়ের সমান অংশ স্ট্রিংয়ের সামগ্রীর সাথে তুলনা করে।

সুতরাং প্রশ্নটি যদি সিস্টেমে সমস্ত স্ট্রিং ক্যাশে থাকে তবে কীভাবে ==মিথ্যা রিটার্ন আসবে যখন সমান সমান হয়? ঠিক আছে, এটা সম্ভব। আপনি যদি নতুন স্ট্রিং String str = new String("Testing")তৈরি করেন তবে ক্যাশে একই সামগ্রী থাকা স্ট্রিং থাকলেও ক্যাশে নতুন স্ট্রিং তৈরি শেষ করে। সংক্ষেপে"MyString" == new String("MyString") সর্বদা মিথ্যা ফিরে আসবে।

জাভা এছাড়াও ইন্টার্ন () ফাংশন সম্পর্কে কথা বলে যা স্ট্রিংতে এটি ক্যাশের অংশ হিসাবে তৈরি করতে ব্যবহার করা যেতে পারে "MyString" == new String("MyString").intern() সত্য হয়ে উঠবে।

দ্রষ্টব্য: == অপারেটর কেবলমাত্র দুটি মেমরি ঠিকানার তুলনা করছেন বলে সমানতার চেয়ে অনেক দ্রুত, তবে আপনার অবশ্যই নিশ্চিত হওয়া দরকার যে কোডটি কোডটিতে নতুন স্ট্রিং উদাহরণ তৈরি করছে না। অন্যথায় আপনি বাগের মুখোমুখি হবেন।


147
String a = new String("foo");
String b = new String("foo");
System.out.println(a == b); // prints false
System.out.println(a.equals(b)); // prints true

আপনি কেন বুঝতে পারছেন তা নিশ্চিত করুন। কারণ ==তুলনাটি কেবলমাত্র রেফারেন্সের সাথে তুলনা করে; দ্যequals()পদ্ধতি বিষয়বস্তু একটি তুলনামূলক চরিত্র-বাই-চরিত্র আছে।

আপনি যখন aএবং এর জন্য নতুন কল করেন তখন bপ্রত্যেকে একটি নতুন রেফারেন্স পায় "foo"যা স্ট্রিং টেবিলের মধ্যে নির্দেশ করে। তথ্যসূত্রগুলি ভিন্ন, তবে বিষয়বস্তু একই।


128

হ্যাঁ, এটা খারাপ ...

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

সমান আপনার জন্য আসল তুলনা করে।


124

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


118

জাভাতে একটি স্ট্রিং পুল রয়েছে যার অধীনে জাভা স্ট্রিং অবজেক্টগুলির জন্য মেমরি বরাদ্দ পরিচালনা করে। জাভাতে স্ট্রিং পুল দেখুন

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

equals আসলে বস্তু শ্রেণীর পদ্ধতি, তবে এটি স্ট্রিং ক্লাসে ওভাররাইড হয় এবং একটি নতুন সংজ্ঞা দেওয়া হয় যা বস্তুর সামগ্রীর সাথে তুলনা করে।

Example:
    stringObjectOne.equals(stringObjectTwo);

তবে মনে রাখবেন এটি স্ট্রিংয়ের ক্ষেত্রে সম্মান করে। আপনি যদি কেস সংবেদনশীল তুলনা করতে চান তবে আপনাকে অবশ্যই স্ট্রিং ক্লাসের ইক্যুয়ালআইগনরেস পদ্ধতিতে যেতে হবে।

দেখা যাক:

String one   = "HELLO"; 
String two   = "HELLO"; 
String three = new String("HELLO"); 
String four  = "hello"; 

one == two;   // TRUE
one == three; // FALSE
one == four;  // FALSE

one.equals(two);            // TRUE
one.equals(three);          // TRUE
one.equals(four);           // FALSE
one.equalsIgnoreCase(four); // TRUE

7
আমি দেখতে পাচ্ছি যে এটি বড় প্রশ্নের দেরিতে উত্তর। আমি কি এটি জিজ্ঞাসা করতে পারি যে এটি সরবরাহ করে যা ইতিমধ্যে বিদ্যমান উত্তরে উল্লেখ করা হয়নি?
রহস্যময়

6
@ মিস্টিয়াল তিনি যোগ করেছেন equalsIgnoreCaseযা নবীনদের জন্য তথ্যমূলক হতে পারে।
অমিতজি

103

আমি জাকেরেটস থেকে উত্তর সঙ্গে একমত।

তবে আপনি যা করতে পারেন তা হ'ল intern()আপনার অ-আক্ষরিক স্ট্রিংগুলিতে কল করা।

জাকেরেটস উদাহরণ থেকে:

// ... but they are not the same object
new String("test") == "test" ==> false 

আপনি যদি অভ্যন্তরীণ হন তবে অ-আক্ষরিক স্ট্রিং সমতাটি হ'ল true:

new String("test").intern() == "test" ==> true 

8
এটি সাধারণত একটি ভাল ধারণা নয়। অভ্যন্তরীণকরণ তুলনামূলকভাবে ব্যয়বহুল এবং (বিদ্বেষপূর্ণভাবে) >> << আপনার জেভিএমস মেমরির পদক্ষেপ এবং জিসি ব্যয় বাড়িয়ে তুলতে পারে। বেশিরভাগ ক্ষেত্রে, এগুলি ==স্ট্রিং তুলনার জন্য ব্যবহার করে পারফরম্যান্সের সুবিধাগুলি ছাড়িয়ে যায় ।
স্টিফেন সি

101

==জাভাতে অবজেক্টের রেফারেন্সের তুলনা করে এবং Stringবস্তুর জন্য এটি ব্যতিক্রম নয় ।

বস্তুর প্রকৃত বিষয়বস্তুর তুলনা করার জন্য (সহ String) অবশ্যই একটি equalsপদ্ধতি ব্যবহার করতে হবে

দুই একটি তুলনামূলক তাহলে Stringবস্তু ব্যবহার ==করিয়া বের হতে trueহয়, কারণ Stringবস্তুর অন্তরীণ করা হয়েছে, এবং জাভা ভার্চুয়াল মেশিন একাধিক রেফারেন্স একই উদাহরণস্বরূপ নির্দেশ হচ্ছে না String। একটিকে আশা করা উচিত নয় যে মূল্যায়ন করতে Stringঅন্য Stringবস্তুর মতো একই বিষয়বস্তুযুক্ত একটি বস্তুর তুলনা ==করা true


99

.equals()ক্লাসে ডেটা তুলনা করে (ধরে নিই ফাংশনটি কার্যকর হয়েছে)। ==পয়েন্টার অবস্থানের তুলনা করে (মেমরিতে বস্তুর অবস্থান)।

==যদি উভয় বস্তু (সীমাবদ্ধতার বিষয়ে কথা না বলা) একই বস্তুর উদাহরণগুলিতে নির্দেশ করে তবে সত্যটি প্রত্যাশা করে। জাভাতে.equals() দুটি বস্তুতে একই ডেটা ভার্সাস সমেত উপস্থিত থাকলে সত্যটি ফিরে আসেequals()==

এটি আপনাকে সাহায্য করতে পারে।


95

==2 টি বস্তু (এই ক্ষেত্রে স্ট্রিংগুলি) মেমরিতে একই বস্তুকে রেফার করে কিনা তা একটি রেফারেন্স সমতা পরীক্ষা করে।

equals()পদ্ধতি কিনা চেক করবে বিষয়বস্তু বা রাজ্যের 2 বস্তুর একই।

স্পষ্টতই ==দ্রুত, তবে 2 Stringটি একই পাঠ্য ধারণ করে কিনা তা আপনি যদি বলতে চান তবে (সম্ভবত) অনেক ক্ষেত্রেই ভুল ফলাফল দেবে ।

অবশ্যই equals()পদ্ধতি ব্যবহারের পরামর্শ দেওয়া হয়।

অভিনয় সম্পর্কে চিন্তা করবেন না। ব্যবহারকে উত্সাহিত করার জন্য কয়েকটি জিনিস String.equals():

  1. String.equals()রেফারেন্সের সমতা (ব্যবহার করে ==) জন্য প্রথম চেক প্রয়োগ করা এবং যদি 2 টি স্ট্রিং রেফারেন্স অনুসারে একই হয় তবে আর কোনও গণনা সম্পাদিত হয় না!
  2. যদি 2 স্ট্রিংয়ের রেফারেন্স একই না হয়, String.equals()তারপরে স্ট্রিংগুলির দৈর্ঘ্য পরীক্ষা করা হবে। এটিও একটি দ্রুত অপারেশন কারণ Stringশ্রেণিটি স্ট্রিংয়ের দৈর্ঘ্য সঞ্চয় করে, অক্ষর বা কোড পয়েন্ট গণনা করার দরকার নেই। দৈর্ঘ্য পৃথক হলে, আর কোনও চেক করা হয় না, আমরা জানি তারা সমান হতে পারে না।
  3. কেবলমাত্র যদি আমরা এ পর্যন্ত পেয়েছি তবে 2 টি স্ট্রিংয়ের বিষয়বস্তুগুলি আসলে তুলনা করা হবে এবং এটি একটি স্বল্প হাতের তুলনা হবে: আমরা যদি কোনও অমিল চরিত্র খুঁজে পাই তবে (সমস্ত অক্ষরের সাথে একই অবস্থানে) সমস্ত অক্ষর তুলনা করা হবে না ), আর কোনও অক্ষর চেক করা হবে না।

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


2
Obviously == is faster- আসলে অন্য কোনও কিছুর আগে .equals(String)প্রথম চেকগুলির বাস্তবায়ন ==তাই আমি বলব গতিটি অভিন্ন।
রাজ্জলে শজল

2
public boolean equals(Object anObject) { if (this == anObject) { return true; } ...
রাজ্জলে শাজল

82

আপনি যদি আমার মতো হন, যখন আমি প্রথম জাভা ব্যবহার শুরু করলাম, আমি দুটি স্ট্রিং দৃষ্টান্ত সমান কিনা তা পরীক্ষা করতে "==" অপারেটরটি ব্যবহার করতে চেয়েছিলাম, তবে আরও ভাল বা খারাপ, জাভাতে এটি করার সঠিক উপায় নয়।

এই টিউটোরিয়ালে আমি জাভা স্ট্রিংগুলির সঠিকভাবে তুলনা করার বিভিন্ন উপায় প্রদর্শন করব যা আমি বেশিরভাগ সময় ব্যবহার করি with এই জাভা স্ট্রিং তুলনা টিউটোরিয়ালটির শেষে আমি জাভা স্ট্রিংগুলির সাথে তুলনা করার সময় কেন "==" অপারেটর কাজ করে না তা আলোচনা করব।

বিকল্প 1: জাভা স্ট্রিংটি সমান পদ্ধতির সাথে তুলনা করে বেশিরভাগ সময় (সম্ভবত 95%) আমি জাভা স্ট্রিং ক্লাসের সমান পদ্ধতির সাথে স্ট্রিংগুলি তুলনা করি, এর মতো:

if (string1.equals(string2))

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

সমান পদ্ধতির সাথে তাত্ক্ষণিক স্ট্রিং তুলনার উদাহরণটি দেখে, নিম্নলিখিত পরীক্ষাটি চালানো হলে দুটি স্ট্রিং সমান বলে বিবেচিত হবে না কারণ অক্ষরগুলি হুবহু এক নয় (চরিত্রগুলির ক্ষেত্রে পৃথক পৃথক):

String string1 = "foo";
String string2 = "FOO";

if (string1.equals(string2))
{
    // this line will not print because the
    // java string equals method returns false:
    System.out.println("The two strings are the same.")
}

তবে, যখন দুটি স্ট্রিংগুলিতে অক্ষরের ঠিক একই স্ট্রিং থাকে, সমান পদ্ধতিটি সত্যটিতে ফিরে আসবে, যেমন এই উদাহরণ হিসাবে:

String string1 = "foo";
String string2 = "foo";

// test for equality with the java string equals method
if (string1.equals(string2))
{
    // this line WILL print
    System.out.println("The two strings are the same.")
}

বিকল্প 2: স্ট্রিং তুলনা সমান আইগনোর কেস পদ্ধতির সাথে

কিছু স্ট্রিং তুলনা পরীক্ষায় আপনি স্ট্রিংগুলি বড় হাতের বা ছোট হাতের না করে উপেক্ষা করতে চান। আপনি যখন এই ক্ষেত্রে-সংবেদনশীল উপায়ে আপনার স্ট্রিংয়ের সাম্যতার জন্য পরীক্ষা করতে চান, তখন স্ট্রিং ক্লাসের সমতুল্য আইগনরেস পদ্ধতিটি ব্যবহার করুন:

String string1 = "foo";
String string2 = "FOO";

 // java string compare while ignoring case
 if (string1.equalsIgnoreCase(string2))
 {
     // this line WILL print
     System.out.println("Ignoring case, the two strings are the same.")
 }

বিকল্প 3: জাভা স্ট্রিং তুলনা করুন পদ্ধতির সাথে

জাভা স্ট্রিংগুলির তুলনা করার জন্য একটি তৃতীয়, কম সাধারণ উপায় রয়েছে এবং এটি স্ট্রিং ক্লাসের তুলনা করার পদ্ধতিতে রয়েছে। যদি দুটি স্ট্রিং হুবহু একই হয় তবে তুলনা পদ্ধতিটি 0 (শূন্য) এর মান প্রদান করবে। এই স্ট্রিং তুলনা পদ্ধতির দেখতে কেমন তার একটি দ্রুত উদাহরণ এখানে:

String string1 = "foo bar";
String string2 = "foo bar";

// java string compare example
if (string1.compareTo(string2) == 0)
{
    // this line WILL print
    System.out.println("The two strings are the same.")
}

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

আপনি এই ==, .Equals (), তুলনা করুন () তুলনা করতে () তুলনা করতে পারেন ()


5
স্ট্রিং লেটারেলের জন্য স্ট্রিং স্ট্রিং 1 এর মতো = "ফু ফু"; স্ট্রিং স্ট্রিং 2 = "ফু ফু"; আপনি সামগ্রীর সমতা পরীক্ষা করতে সরাসরি == অপারেটরটি ব্যবহার করতে পারেন
জাভা

1
গুগল অ্যাপস স্ক্রিপ্টে "তুলনা করুন" সম্ভাব্য নয়। আমি ইনস্টল "সমান" চেষ্টা করলাম এটিই একমাত্র সমাধান যা কাজ করে ....
user3887038

77

ফাংশন:

public float simpleSimilarity(String u, String v) {
    String[] a = u.split(" ");
    String[] b = v.split(" ");

    long correct = 0;
    int minLen = Math.min(a.length, b.length);

    for (int i = 0; i < minLen; i++) {
        String aa = a[i];
        String bb = b[i];
        int minWordLength = Math.min(aa.length(), bb.length());

        for (int j = 0; j < minWordLength; j++) {
            if (aa.charAt(j) == bb.charAt(j)) {
                correct++;
            }
        }
    }

    return (float) (((double) correct) / Math.max(u.length(), v.length()));
}

টেস্ট:

String a = "This is the first string.";

String b = "this is not 1st string!";

// for exact string comparison, use .equals

boolean exact = a.equals(b);

// For similarity check, there are libraries for this
// Here I'll try a simple example I wrote

float similarity = simple_similarity(a,b);

6
এটি অন্যান্য উত্তর থেকে কীভাবে আলাদা? এবং আপনি যেভাবে পরামর্শ দিন
সেভাবে

2
মধ্যে পার্থক্য প্রশ্ন @Mark ==এবং equalsইতিমধ্যে অন্যান্য সমাধানের উত্তর ছিল, আমি শুধু একটি আলগা ভাবে স্ট্রিং তুলনা করার জন্য একটি অন্যভাবে প্রদত্ত
Khaled.K

77

==অপারেটর চেক দুই রেফারেন্স একই বস্তুর বা না নির্দেশ করে। .equals()প্রকৃত স্ট্রিং সামগ্রী (মান) জন্য পরীক্ষা করুন।

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

  • মামলা 1

    String s1 = "Stack Overflow";
    String s2 = "Stack Overflow";
    s1 == s2;      //true
    s1.equals(s2); //true

    কারণ: নাল ছাড়াই তৈরি স্ট্রিং লিটারেলগুলি স্তূপের পার্জেন অঞ্চলে স্ট্রিং পুলে সংরক্ষণ করা হয়। সুতরাং উভয় s1 এবং s2 পুল একই পয়েন্ট।

  • মামলা 2

    String s1 = new String("Stack Overflow");
    String s2 = new String("Stack Overflow");
    s1 == s2;      //false
    s1.equals(s2); //true

    কারণ: আপনি newকীওয়ার্ডটি ব্যবহার করে একটি স্ট্রিং অবজেক্ট তৈরি করলে তার জন্য পৃথক স্থান বরাদ্দ করা হয়েছে ap


53

==বস্তুর রেফারেন্স মানকে তুলনা করে যেখানে শ্রেণিতে equals()উপস্থিত পদ্ধতিটি বস্তুর java.lang.Stringসামগ্রীগুলি String(অন্য কোনও বস্তুর সাথে) তুলনা করে ।


15
নিট পিক হতে হবে না, তবে এর equals()পদ্ধতিটি Stringআসলে Stringক্লাসে রয়েছে, অন্তর্ভুক্ত নয় Object। ডিফল্ট equals()মধ্যে Objectতুলনা হবে না যে বিষয়বস্তু একই হয়, এবং সত্য মাত্র ফেরৎ সত্য যখন রেফারেন্স একই।
জ্যাকব শোয়েন

1
@ জ্যাকবস্কোয়েন: গ্রেপকোড ডাউন হওয়ায় উপরের লিঙ্কটি আর কাজ করে না। সমান বাস্তবায়নের বিকল্পটি এখানে রয়েছে: [ইনলাইন লিংক] ( zgrepcode.com/java/openjdk/10.0.2/java.base/java/lang/… )
আমনদীপ সিং

50

আমি মনে করি আপনি যখন একটি সংজ্ঞায়িত করেন Stringআপনি কোনও বস্তুর সংজ্ঞা দেন। সুতরাং আপনি ব্যবহার করা প্রয়োজন .equals()। আপনি যখন আদিম ডেটা ব্যবহার করেন ==তবে আপনি String(এবং যে কোনও অবজেক্ট) ব্যবহার করা উচিত .equals()


7
"চর []" কোনও প্রাথমিক তথ্য প্রকার নয়! এটি "চর" এর অ্যারে এবং অ্যারেগুলি আদিম উপাত্তের ধরণের নিজস্বতা নয়।
খ্রিস্টান

48

তাহলে equals()পদ্ধতি উপস্থিত java.lang.Objectবর্গ, এবং এটি উপর বস্তু রাষ্ট্রের সমানতা জন্য চেক করতে বলে আশা করা হচ্ছে! তার মানে, বস্তুর বিষয়বস্তু। যেখানে ==অপারেটর চেক করতে বলে আশা করা হচ্ছে প্রকৃত বস্তু দৃষ্টান্ত একই বা হয় না।

উদাহরণ

দুটি পৃথক রেফারেন্স ভেরিয়েবল বিবেচনা করুন str1এবং str2:

str1 = new String("abc");
str2 = new String("abc");

আপনি যদি ব্যবহার equals()

System.out.println((str1.equals(str2))?"TRUE":"FALSE");

আপনি TRUEযদি ব্যবহার করেন তবে আউটপুট পাবেন ==

System.out.println((str1==str2) ? "TRUE" : "FALSE");

এখন আপনি FALSEআউটপুট হিসাবে পাবেন , কারণ উভয় str1এবং str2দুটি পৃথক বস্তুর দিকে ইশারা করছে যদিও উভয়ই একই স্ট্রিংয়ের সামগ্রী ভাগ করে। এটি new String()প্রতিবারই একটি নতুন অবজেক্ট তৈরি হওয়ার কারণে ।


43

অপারেটর == সর্বদা অবজেক্ট রেফারেন্স তুলনার জন্য বোঝানো হয় , তবে স্ট্রিং ক্লাস .equals () পদ্ধতি সামগ্রী তুলনার জন্য ওভাররাইড করা হয় :

String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2); // It prints false (reference comparison)
System.out.println(s1.equals(s2)); // It prints true (content comparison)

40

সমস্ত বস্তুর একটি .equals()পদ্ধতির গ্যারান্টিযুক্ত যেহেতু অবজেক্টটিতে একটি পদ্ধতি রয়েছে .equals(), এটি একটি বুলিয়ান দেয়। যদি আরও সংজ্ঞায়িত সংজ্ঞা প্রয়োজন হয় তবে এই পদ্ধতিটি ওভাররাইড করা সাবক্লাসের কাজ। এটি ছাড়াই (অর্থাত্ ব্যবহার করে ==) সামঞ্জস্যের জন্য দুটি বস্তুর মধ্যে কেবল মেমরি ঠিকানাগুলি পরীক্ষা করা হয়। স্ট্রিং এই .equals()পদ্ধতিটিকে ওভাররাইড করে এবং মেমরি ঠিকানা ব্যবহার করার পরিবর্তে এটি সাম্যতার জন্য অক্ষরের স্তরে স্ট্রিংগুলির তুলনা প্রদান করে।

একটি মূল নোট হ'ল স্ট্রিংগুলি একটি গলিত পুলে সংরক্ষণ করা হয় তাই একবার স্ট্রিং তৈরি হয়ে গেলে এটি চিরতরে একই ঠিকানায় একটি প্রোগ্রামে সংরক্ষণ করা হয়। স্ট্রিংগুলি পরিবর্তন হয় না, তারা পরিবর্তনযোগ্য। এই কারণেই যদি আপনার স্ট্রিং প্রসেসিংয়ের পরিমাণ গুরুতর হয় তবে নিয়মিত স্ট্রিং কনটেনটেশন ব্যবহার করা খারাপ ধারণা। পরিবর্তে আপনি StringBuilderসরবরাহিত ক্লাস ব্যবহার করবেন । মনে রাখবেন এই স্ট্রিংয়ের পয়েন্টারগুলি পরিবর্তিত হতে পারে এবং আপনি যদি দুটি পয়েন্টার একই ছিল কিনা তা দেখতে আগ্রহী হন তবে ==ভাল উপায় হবে। স্ট্রিংগুলি তারা করে না।


2
"একবার স্ট্রিং তৈরি হয়ে গেলে এটি স্থায়ীভাবে একই ঠিকানায় একটি প্রোগ্রামে সংরক্ষণ করা হয়" - এটি ফ্ল্যাট-আউট ভুল। শুধুমাত্র সংকলন-সময় ধ্রুব স্ট্রিং এক্সপ্রেশন (সম্ভবত final Stringভেরিয়েবলগুলি জড়িত ) এবং স্ট্রিংগুলি যে আপনার প্রোগ্রামটি স্পষ্টভাবে ইন্টার্নগুলি সংরক্ষণ করে যা আপনি "গল্ফ পুল" বলছেন। অন্য Stringকোনও ধরণের অবজেক্টের মতোই আর কোনও লাইভ রেফারেন্স না থাকলে অন্যান্য সমস্ত বস্তু আবর্জনা সংগ্রহের বিষয় to এছাড়াও, পুরো ইন্টার্নিং মেকানিজমকে কাজ করার জন্য অপরিবর্তনীয়তা প্রয়োজন হলেও এটি অন্যথায় অপ্রাসঙ্গিক।
টেড হপ্প

স্ট্রিং তুলনা হয় সমান বা সমান ইগনোরেস পদ্ধতি দ্বারা সম্পন্ন হয় যা আসলে স্ট্রিংয়ের সামগ্রীগুলির সাথে তুলনা করে। তবে == চিহ্নটি কেবল রেফারেন্সের মানগুলি পরীক্ষা করে। স্ট্রিং পুল থেকে স্ট্রিং এর জন্য এই ক্ষেত্রে ভাল কাজ করবে। স্ট্রিং এস 1 = নতুন স্ট্রিং ("এ"); স্ট্রিং এস 2 = নতুন স্ট্রিং ("এ"); এই ক্ষেত্রে s1 == s2 মিথ্যা, তবে s1.equals (s2) সত্য।
শৈলেন্দ্র সিং

39

compareTo()দুটি স্ট্রিংয়ের তুলনা করার জন্যও আপনি এই পদ্ধতিটি ব্যবহার করতে পারেন । যদি তুলনামূলক ফলাফলটি 0 হয় তবে দুটি স্ট্রিং সমান, অন্যথায় তুলনা করা স্ট্রিংগুলি সমান হয় না।

==রেফারেন্স তুলনা এবং প্রকৃত স্ট্রিং তুলনা নেই। আপনি যদি প্রতিটি স্ট্রিং ব্যবহার করে তৈরি করে থাকেন new String(somestring).intern()তবে আপনি ==দুটি স্ট্রিং তুলনা করতে অপারেটরটি ব্যবহার করতে পারেন , অন্যথায় সমান () বা তুলনামূলক পদ্ধতি ব্যবহার করা যেতে পারে।


35

জাভাতে, যখন "==" অপারেটরটি 2 টি বস্তুর তুলনা করতে ব্যবহৃত হয়, তখন এটি পরীক্ষা করে দেখায় যে বস্তুগুলি একই স্থানে মেমরির ক্ষেত্রে উল্লেখ করে কিনা। অন্য কথায়, এটি দুটি বস্তুর নামগুলি একই মেমরির অবস্থানের জন্য মূলত উল্লেখ আছে কিনা তা পরীক্ষা করে দেখেছে।

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

দ্য ==অপারেটর চেক যদি দুটি স্ট্রিং ঠিক একই বস্তুর হয়।

.equals()পদ্ধতি চেক দুটি স্ট্রিং একই মান থাকে।


1
যদি সেগুলির মধ্যে একটি নাল না হয়, যেহেতু s.equals (s2) ক্রম করবে যদি s নাল হয়, তুলনা ব্যর্থ হওয়ার কারণ হয়ে যায়। অবশ্যই, এটি উত্তরটির সাথে সত্যই বিরোধিতা করে না; এটা ঠিক একটা ক্যাভিয়েট
জন কোম্বস

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