String#equals
পদ্ধতি এবং পদ্ধতির মধ্যে পার্থক্য কী String#contentEquals
?
String#equals
পদ্ধতি এবং পদ্ধতির মধ্যে পার্থক্য কী String#contentEquals
?
উত্তর:
কেবল String#equals()
স্ট্রিংয়ের বিষয়বস্তুগুলির সাথেই তুলনা করা হয় তা নয়, এটি পরীক্ষা করে যদি অন্য বস্তুটিও একটি এর উদাহরণ হিসাবে থাকে String
। String#contentEquals()
শুধুমাত্র বিষয়বস্তু (চরিত্র ক্রম) তুলনা এবং নেই না পরীক্ষা হলে অন্য বস্তুর এছাড়াও একটি দৃষ্টান্ত হল String
। এটা দীর্ঘ হিসাবে কিছু হতে পারে যেমন একটি বাস্তবায়ন হয় CharSequence
Ao জুড়ে যা String
, StringBuilder
, StringBuffer
, CharBuffer
, ইত্যাদি
==
অপারেটর কেবল দুটি রেফারেন্সের বিষয়বস্তু নয় রেফারেন্স তুলনা করতে আপনাকে অনুমতি দেবে ।
==
উল্লিখিতটি কেবল জাভাস্ক্রিপ্ট; এটি জাভা সম্পর্কে উল্লেখ করা হয় না।
==
জাভাস্ক্রিপ্টে তুলনায় অনেক লঘু, contentEquals
যা সংখ্যার স্পর্শ করবে না), তবে আপনি equals
সঠিক ধরণের ম্যাচের সাথেStrings
পরীক্ষা করার বিষয়ে সঠিক (অন্য শ্রেণিগুলি তাদের equals
পদ্ধতিতে প্রকারের সাথে আলগা হতে পারে ) ।
এটি সহজেই বলা যায়: String.contentEquals()
এর বুদ্ধিমান ভাই String.equals()
, কারণ এটি বাস্তবায়নের চেয়ে আরও বেশি মুক্ত হতে পারে String.equals()
।
পৃথক String.contentEquals()
পদ্ধতি থাকার কারণ রয়েছে । আমার মনে হয় সবচেয়ে গুরুত্বপূর্ণ কারণ হ'ল:
equals
পদ্ধতি আত্মবাচক হতে হয়েছে। তার মানে যে: x.equals(y) == y.equals(x)
। এটি ইঙ্গিত দেয় যে aString.equals(aStringBuffer)
একই হতে হবে aStringBuffer.equals(aString)
। এর জন্য জাভা এপিআই বিকাশকারীদের equals()
স্ট্রিংবুফার, স্ট্রিংবুডার এবং চারসেকেন্সের পদ্ধতিতে স্ট্রিংয়ের জন্য কিছু বিশেষ প্রয়োগ করা প্রয়োজন । এটি একটি গোলযোগ হবে।এই কোথায় String.contentEquals
আসে। এই হল স্বতন্ত্র পদ্ধতি নয় যে না আছে কঠোর প্রয়োজনীয়তা ও নিয়ম অনুসরণ জন্য Object.equals
। এইভাবে, আপনি "সমান বিষয়বস্তুর" ধারণাটি আরও অবাধে প্রয়োগ করতে পারেন । উদাহরণস্বরূপ এটি আপনাকে স্ট্রিংবুফার এবং একটি স্ট্রিংয়ের মধ্যে বুদ্ধিমান তুলনা করতে দেয়।
এবং ঠিক পার্থক্যটি কি তা বলতে:
String.contentEquals()
এগুলির একটি String
, ক StringBuilder
, ক StringBuffer
, ক CharSequence
এবং সমস্ত উত্পন্ন শ্রেণীর সামগ্রীর তুলনা করতে পারে । যদি প্যারামিটারটি স্ট্রিং টাইপ করে থাকে তবে String.equals()
এক্সিকিউট করুন।
String.equals()
কেবল স্ট্রিং অবজেক্টের সাথে তুলনা করে। অন্যান্য সমস্ত বস্তুর প্রকার সমান নয় বলে বিবেচিত হয়।
String.contentEquals()
তুলনা করতে পারেন StringBuffer
এবং StringBuilder
একটি বুদ্ধিমান উপায়ে। এটি ভারী পদ্ধতিটিকে কল করে নাtoString()
, যা সম্পূর্ণ সামগ্রীটি একটি নতুন স্ট্রিং অবজেক্টে অনুলিপি করে। পরিবর্তে, এটি অন্তর্নিহিত char[]
অ্যারের সাথে তুলনা করে , যা দুর্দান্ত।
এই উত্তরটি ইতিমধ্যে ডিবিডাব্লু দ্বারা পোস্ট করা হয়েছিল তবে তিনি এটি মুছে ফেলেছিলেন তবে মৃত্যুদন্ড কার্যকর করার সময়টির তুলনা করার সময় তার পার্থক্যের জন্য কিছু কার্যকর বৈধ পয়েন্ট ছিল, কী ব্যতিক্রম ছুঁড়ে দেওয়া হয়েছে,
আপনি যদি সোর্স কোডটি স্ট্রিং # সমান এবং স্ট্রিং # বিষয়বস্তুতে দেখেন তবে এটি স্পষ্ট হয় যে দুটি ওভাররাইড পদ্ধতি রয়েছে String#contentEquals
যা একটি StringBuilder
এবং অন্যটি গ্রহণ করে CharSequence
।
তাদের মধ্যে পার্থক্য,
String#contentEquals
যদি যুক্তি সরবরাহ করা হয় null
তবে String#equals
ফিরে আসবে তবে এনপিই নিক্ষেপ করবেfalse
String#equals
কন্টেন্ট শুধুমাত্র যখন যুক্তি সরবরাহকৃত তুলনা instance of String
অন্যথায় এটি ফিরে আসবে false
অন্যান্য সব ক্ষেত্রে কিন্তু অন্যদিকে String#contentEquals
সমস্ত বস্তু যা ইন্টারফেস বাস্তবায়ন বিষয়বস্তু চেক CharSequence
।আপনি কোডটিও টুইট করতে পারেন যাতে নীচের চিত্রের মতো পাস করা যুক্তিটির String#contentEquals
ওভাররাইড equals
পদ্ধতিতে আপনি চান এমন ভুল ফলাফল বা ফলাফলটি ফিরে আসতে পারেন তবে আপনি সেই টুইটগুলি করতে পারবেন না String#equals
।
নীচের কোডটিতে সর্বদাtrue
3 অক্ষরের দীর্ঘ যে s
কোনও string
উপাদান থাকে ততক্ষণ উত্পাদিত হবে
String s= new String("abc");// "abc";
System.out.println(s.contentEquals(new CharSequence()
{
@Override
public CharSequence subSequence(int arg0, int arg1) {
// TODO Auto-generated method stub
return null;
}
@Override
public int length() {
// TODO Auto-generated method stub
return 0;
}
@Override
public char charAt(int arg0) {
// TODO Auto-generated method stub
return 0;
}
@Override
public boolean equals(Object obj)
{
return true;
}
}));
String#contentEquals
যদি String#Equals
আর্গুমেন্ট সরবরাহ করা হয় instance of String
এবং উভয়ের দৈর্ঘ্য String
সমান হয় তবে বিষয়বস্তু সমান হয় না তবে ক্ষেত্রে ক্ষেত্রে ধীর হবে ।
উদাহরণস্বরূপ যদি স্ট্রিং হয় String s = "madam"
এবং String argPassed = "madan"
তার s.contentEquals(argPassed)
তুলনায় তুলনায় এই ক্ষেত্রে প্রায় দ্বিগুণ কার্যকর সময় লাগবেs.equals(argPassed)
যদি উভয় স্ট্রিংয়ের জন্য সামগ্রীর দৈর্ঘ্য একই না থাকে String#contentEquals
তবে String#Equals
প্রায় সমস্ত ক্ষেত্রেই ফাংশনটির আরও ভাল পারফরম্যান্স হবে।
তার উত্তর যুক্ত করার জন্য আরও একটি বিষয়
String#contentEquals
কোনও String
অবজেক্টের StringBuilder
বিষয়বস্তুর সাথে তুলনা করা হবে এবং String#Equals
ফিরে আসার সময় উপযুক্ত ফলাফল সরবরাহ করবেfalse
String
শ্রেণি equals(Object o)
পদ্ধতিটি কেবল String
তুলনা করে। তবে contentEquals(CharSequence cs)
ক্লাসগুলির জন্য চেকগুলি বর্ধিত হয় AbstractStringBuilder
অর্থাত্ StringBuffer
, StringBuilder
এবং String
ক্লাসটিও (তারা সমস্ত প্রকারের হয় CharSequence
)।
String str = "stackoverflow";
StringBuilder builder = new StringBuilder(str);
System.out.println(str.equals(builder));
System.out.println(str.contentEquals(builder));
আউটপুট:
false
true
প্রথম stmt আউটপুট হয় false
কারণ builder
ধরণ নয় String
, যাতে equals()
আয় false
কিন্তু contentEquals()
মত সব ধরনের বিষয়বস্তুর জন্য চেক StringBuilder
, StringBuffer
, String
এবং হিসাবে বিষয়বস্তু একই অত: পর হয় true
।
contentEquals
নিক্ষেপ করা হবে NullPointerException
যদি যুক্তি সরবরাহকৃত null
কিন্তু equals()
মিথ্যা ফিরে আসবে কারণ সমান () instanceof জন্য চেক ( if (anObject instance of String)
) যা মিথ্যা ফেরৎ যদি যুক্তি null
।contentEquals(CharSequence cs)
:
java.lang.CharacterSequence
(যেমন, CharBuffer
, Segment
, String
, StringBuffer
, StringBuilder
)equals(Object anObject)
:
java.lang.String
আরটিএফসি :)
যেহেতু উত্সটি পড়ার বিষয়টি এটি বোঝার সর্বোত্তম উপায়, তাই আমি উভয় পদ্ধতির প্রয়োগগুলি ভাগ করছি (জেডকে 1.7.0_45 হিসাবে)
public boolean contentEquals(CharSequence cs) {
if (value.length != cs.length())
return false;
// Argument is a StringBuffer, StringBuilder
if (cs instanceof AbstractStringBuilder) {
char v1[] = value;
char v2[] = ((AbstractStringBuilder) cs).getValue();
int i = 0;
int n = value.length;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
// Argument is a String
if (cs.equals(this))
return true;
// Argument is a generic CharSequence
char v1[] = value;
int i = 0;
int n = value.length;
while (n-- != 0) {
if (v1[i] != cs.charAt(i))
return false;
i++;
}
return true;
}
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String) anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
স্ট্রিংয়ের # কন্টেন্টএকুয়ালস () এর আরও একটি পদ্ধতি রয়েছে:
public boolean contentEquals(StringBuffer sb) {
synchronized(sb) {
return contentEquals((CharSequence)sb);
}
}
equals()
এবং ক্লাসে দুটি এবং দুটি সাথে তুলনা করার contentEquals()
দুটি পদ্ধতি ।String
strings
string
StringBuffer
এর পরামিতিগুলি contentEquals()
হয় StringBuffer
এবং String(charSequence)
। equals()
দুই তুলনা করতে ব্যবহৃত হয় strings
এবং contentEquals()
বিষয়বস্তু তুলনা করতে ব্যবহৃত হয় String
এবং StringBuffer
।
পদ্ধতি contentEquals
এবং equals
হয়
public boolean contentEquals(java.lang.StringBuffer);
public boolean contentEquals(java.lang.CharSequence);
public boolean equals(Object o)
এখানে একটি কোড যা উভয় পদ্ধতি বর্ণনা করে
public class compareString {
public static void main(String[] args) {
String str1 = "hello";
String str2 = "hello";
StringBuffer sb1 = new StringBuffer("hello");
StringBuffer sb2 = new StringBuffer("world");
boolean result1 = str1.equals(str2); // works nice and returns true
System.out.println(" str1.equals(str2) - "+ result1);
boolean result2 = str1.equals(sb1); // works nice and returns false
System.out.println(" str1.equals(sb1) - "+ result2);
boolean result3 = str1.contentEquals(sb1); // works nice and returns true
System.out.println(" str1.contentEquals(sb1) - "+ result3);
boolean result4 = str1.contentEquals(sb2); // works nice and returns false
System.out.println(" str1.contentEquals(sb2) - "+ result4);
boolean result5 = str1.contentEquals(str2); // works nice and returns true
System.out.println(" str1.contentEquals(str2) - "+ result5);
}
}
আউটপুট:
str1.equals(str2) - true
str1.equals(sb1) - false
str1.contentEquals(sb1) - true
str1.contentEquals(sb2) - false
str1.contentEquals(str2) - true
স্ট্রিং # টি সমান অবজেক্টটিকে একটি আর্গুমেন্ট হিসাবে গ্রহণ করে এবং এটি স্ট্রিং অবজেক্টের উদাহরণ হিসাবে পরীক্ষা করে। যদি আর্গুমেন্ট অবজেক্ট স্ট্রিং অবজেক্ট হয় তবে এটি কন্টেন্ট ক্যারেক্টারের সাথে চরিত্রের তুলনা করে। উভয় স্ট্রিং অবজেক্টের বিষয়বস্তু একই হলে এটি সত্য হয়।
স্ট্রিং # কন্টেন্টএকুয়ালস আর্গুমেন্ট হিসাবে চারসেকেন্স ইন্টারফেস নেয়। চরসিক্যেন্সটি 2 উপায়ে প্রয়োগ করা যেতে পারে - i) স্ট্রিং ক্লাস বা (ii) অ্যাবস্ট্রাক স্ট্রিংবিল্ডার (স্ট্রিংবফার এর প্যারেন্ট ক্লাস, স্ট্রিংবুডার)
ইন contentEquals () দৈর্ঘ্য কোন বস্তুর উদাহরণস্বরূপ চেক সামনে তুলনা করা হয়। দৈর্ঘ্য যদি একই থাকে তবে এটি আর্গুমেন্ট অবজেক্টটি অ্যাবস্ট্রাকস্ট্রিংবিল্ডারের উদাহরণ কিনা তা পরীক্ষা করে। এটি যদি তাই হয় (অর্থাত্ স্ট্রিংবুফার বা স্ট্রিংবিল্ডার) তবে সামগ্রীগুলি অক্ষর অনুসারে চেক করা হয়। যদি আর্গুমেন্ট স্ট্রিং অবজেক্টের উদাহরণ হয় তবে স্ট্রিং # টি সমান সমীকরণ থেকে স্ট্রিং # সমান।
সংক্ষেপে,
স্ট্রিং # টি সমান যুক্তিযুক্ত স্ট্রিং অবজেক্টের ক্ষেত্রে বিষয়বস্তু অক্ষরটিকে চরিত্রের সাথে তুলনা করে। এবং স্ট্রিং # কন্টেন্টএকুয়ালস চার্জ সেকেন্ড ইন্টারফেস বাস্তবায়নের ক্ষেত্রে সামগ্রীর সাথে তুলনা করে content
স্ট্রিং # কন্টেন্টএকুয়ালস স্ট্রিং # কন্টেন্টএকুয়ালস হিসাবে অভ্যন্তরীণভাবে স্ট্রিং অবজেক্টের জন্য স্ট্রিং # সমানকে কল করে আমরা দুটি একই দৈর্ঘ্যের স্ট্রিং সামগ্রীর তুলনায় ক্ষেত্রে ধীর হয়।
যদি আমরা পৃথক সামগ্রীর দৈর্ঘ্যের সাথে অবজেক্টগুলির তুলনা করার চেষ্টা করি ("abcd" দিয়ে "abc" বলি) তারপরে স্ট্রিং # কন্টেন্টক্যুয়ালগুলি স্ট্রিং # সমানর চেয়ে দ্রুত। কারণ কোনও বস্তুর উদাহরণ যাচাইয়ের আগে দৈর্ঘ্যের তুলনা করা হয়।
contentEquals()
পদ্ধতি চেক বিষয়বস্তু একটি মধ্যবর্তী একই হয় String
, StringBuffer
ইত্যাদি যা গৃহস্থালির কাজ ক্রম কিছু।
বিটিডাব্লু, পার্থক্যের historicalতিহাসিক কারণটি হ'ল স্ট্রিংয়ের মূলত কোনও সুপারক্লাস ছিল না, সুতরাং স্ট্রিং.ইকুয়ালস () একটি স্ট্রিংকে তার যুক্তি হিসাবে গ্রহণ করে। যখন চারসেকেন্সকে স্ট্রিংয়ের সুপারক্লাস হিসাবে পরিচয় করানো হয়েছিল, তখন এটির নিজের একটি সমতা পরীক্ষা দরকার যা সমস্ত চার সিকোয়েন্স বাস্তবায়ন জুড়ে কাজ করেছিল এবং এটি স্ট্রিং দ্বারা ইতিমধ্যে ব্যবহৃত সমান () এর সাথে সংঘর্ষিত হবে না ... সুতরাং আমরা CharSequence.contentEquals পেয়েছি ( ), যা স্ট্রিং দ্বারা উত্তরাধিকার সূত্রে প্রাপ্ত।
চারসেকেন্সটি যদি জাভা ০.০ এ উপস্থিত থাকে তবে আমাদের কেবলমাত্র চারসেকেন্স.ইকুয়াল () থাকতে পারে এবং স্ট্রিং কেবল এটিকে বাস্তবায়ন করতে পারে।
আহ, বিকশিত ভাষাগুলির আনন্দ ...
==
(কন্টেন্টএকুয়ালস) এবং===
(সমান) সমান?