স্ট্রিং # টি সমান এবং স্ট্রিং # কন্টেন্টএকোয়াল পদ্ধতিগুলির মধ্যে পার্থক্য


উত্তর:


171

কেবল String#equals()স্ট্রিংয়ের বিষয়বস্তুগুলির সাথেই তুলনা করা হয় তা নয়, এটি পরীক্ষা করে যদি অন্য বস্তুটিও একটি এর উদাহরণ হিসাবে থাকে StringString#contentEquals()শুধুমাত্র বিষয়বস্তু (চরিত্র ক্রম) তুলনা এবং নেই না পরীক্ষা হলে অন্য বস্তুর এছাড়াও একটি দৃষ্টান্ত হল String। এটা দীর্ঘ হিসাবে কিছু হতে পারে যেমন একটি বাস্তবায়ন হয় CharSequenceAo জুড়ে যা String, StringBuilder, StringBuffer, CharBuffer, ইত্যাদি


12
তাহলে, এটি কি জাভাস্ক্রিপ্টে অপারেটরদের ==(কন্টেন্টএকুয়ালস) এবং ===(সমান) সমান?
anestv

2
@ আনেস্তভ জাভাতে ==অপারেটর কেবল দুটি রেফারেন্সের বিষয়বস্তু নয় রেফারেন্স তুলনা করতে আপনাকে অনুমতি দেবে ।
স্টিফান

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

2
@ স্টেফান, ==উল্লিখিতটি কেবল জাভাস্ক্রিপ্ট; এটি জাভা সম্পর্কে উল্লেখ করা হয় না।
ওলাথে

@ এনেস্টভ, পার্থক্য রয়েছে ( ==জাভাস্ক্রিপ্টে তুলনায় অনেক লঘু, contentEqualsযা সংখ্যার স্পর্শ করবে না), তবে আপনি equalsসঠিক ধরণের ম্যাচের সাথেStrings পরীক্ষা করার বিষয়ে সঠিক (অন্য শ্রেণিগুলি তাদের equalsপদ্ধতিতে প্রকারের সাথে আলগা হতে পারে ) ।
ওলাথে

43

এটি সহজেই বলা যায়: 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[]অ্যারের সাথে তুলনা করে , যা দুর্দান্ত।


31

এই উত্তরটি ইতিমধ্যে ডিবিডাব্লু দ্বারা পোস্ট করা হয়েছিল তবে তিনি এটি মুছে ফেলেছিলেন তবে মৃত্যুদন্ড কার্যকর করার সময়টির তুলনা করার সময় তার পার্থক্যের জন্য কিছু কার্যকর বৈধ পয়েন্ট ছিল, কী ব্যতিক্রম ছুঁড়ে দেওয়া হয়েছে,

আপনি যদি সোর্স কোডটি স্ট্রিং # সমান এবং স্ট্রিং # বিষয়বস্তুতে দেখেন তবে এটি স্পষ্ট হয় যে দুটি ওভাররাইড পদ্ধতি রয়েছে String#contentEqualsযা একটি StringBuilderএবং অন্যটি গ্রহণ করে CharSequence
তাদের মধ্যে পার্থক্য,

  1. String#contentEqualsযদি যুক্তি সরবরাহ করা হয় nullতবে String#equalsফিরে আসবে তবে এনপিই নিক্ষেপ করবেfalse
  2. String#equalsকন্টেন্ট শুধুমাত্র যখন যুক্তি সরবরাহকৃত তুলনা instance of Stringঅন্যথায় এটি ফিরে আসবে falseঅন্যান্য সব ক্ষেত্রে কিন্তু অন্যদিকে String#contentEqualsসমস্ত বস্তু যা ইন্টারফেস বাস্তবায়ন বিষয়বস্তু চেক CharSequence
  3. আপনি কোডটিও টুইট করতে পারেন যাতে নীচের চিত্রের মতো পাস করা যুক্তিটির 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;
            }
        }));
  4. String#contentEqualsযদি String#Equalsআর্গুমেন্ট সরবরাহ করা হয় instance of Stringএবং উভয়ের দৈর্ঘ্য Stringসমান হয় তবে বিষয়বস্তু সমান হয় না তবে ক্ষেত্রে ক্ষেত্রে ধীর হবে ।
    উদাহরণস্বরূপ যদি স্ট্রিং হয় String s = "madam"এবং String argPassed = "madan"তার s.contentEquals(argPassed)তুলনায় তুলনায় এই ক্ষেত্রে প্রায় দ্বিগুণ কার্যকর সময় লাগবেs.equals(argPassed)

  5. যদি উভয় স্ট্রিংয়ের জন্য সামগ্রীর দৈর্ঘ্য একই না থাকে String#contentEqualsতবে String#Equalsপ্রায় সমস্ত ক্ষেত্রেই ফাংশনটির আরও ভাল পারফরম্যান্স হবে।

তার উত্তর যুক্ত করার জন্য আরও একটি বিষয়

  1. String#contentEqualsকোনও Stringঅবজেক্টের StringBuilderবিষয়বস্তুর সাথে তুলনা করা হবে এবং String#Equalsফিরে আসার সময় উপযুক্ত ফলাফল সরবরাহ করবেfalse

4
@dbw এই উত্তরটি আপনার পোস্ট করা উত্তর থেকে এসেছে
প্রতীক

@dbw পাশাপাশি, আপনি কেন আপনার পোস্টটি মুছে ফেললেন?
এমসি সম্রাট

14
  • 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

14

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);
    }
}

9

equals()এবং ক্লাসে দুটি এবং দুটি সাথে তুলনা করার contentEquals()দুটি পদ্ধতি ।StringstringsstringStringBuffer

এর পরামিতিগুলি 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

7

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

স্ট্রিং # কন্টেন্টএকুয়ালস আর্গুমেন্ট হিসাবে চারসেকেন্স ইন্টারফেস নেয়। চরসিক্যেন্সটি 2 উপায়ে প্রয়োগ করা যেতে পারে - i) স্ট্রিং ক্লাস বা (ii) অ্যাবস্ট্রাক স্ট্রিংবিল্ডার (স্ট্রিংবফার এর প্যারেন্ট ক্লাস, স্ট্রিংবুডার)

ইন contentEquals () দৈর্ঘ্য কোন বস্তুর উদাহরণস্বরূপ চেক সামনে তুলনা করা হয়। দৈর্ঘ্য যদি একই থাকে তবে এটি আর্গুমেন্ট অবজেক্টটি অ্যাবস্ট্রাকস্ট্রিংবিল্ডারের উদাহরণ কিনা তা পরীক্ষা করে। এটি যদি তাই হয় (অর্থাত্ স্ট্রিংবুফার বা স্ট্রিংবিল্ডার) তবে সামগ্রীগুলি অক্ষর অনুসারে চেক করা হয়। যদি আর্গুমেন্ট স্ট্রিং অবজেক্টের উদাহরণ হয় তবে স্ট্রিং # টি সমান সমীকরণ থেকে স্ট্রিং # সমান।

সংক্ষেপে,

স্ট্রিং # টি সমান যুক্তিযুক্ত স্ট্রিং অবজেক্টের ক্ষেত্রে বিষয়বস্তু অক্ষরটিকে চরিত্রের সাথে তুলনা করে। এবং স্ট্রিং # কন্টেন্টএকুয়ালস চার্জ সেকেন্ড ইন্টারফেস বাস্তবায়নের ক্ষেত্রে সামগ্রীর সাথে তুলনা করে content

স্ট্রিং # কন্টেন্টএকুয়ালস স্ট্রিং # কন্টেন্টএকুয়ালস হিসাবে অভ্যন্তরীণভাবে স্ট্রিং অবজেক্টের জন্য স্ট্রিং # সমানকে কল করে আমরা দুটি একই দৈর্ঘ্যের স্ট্রিং সামগ্রীর তুলনায় ক্ষেত্রে ধীর হয়।

যদি আমরা পৃথক সামগ্রীর দৈর্ঘ্যের সাথে অবজেক্টগুলির তুলনা করার চেষ্টা করি ("abcd" দিয়ে "abc" বলি) তারপরে স্ট্রিং # কন্টেন্টক্যুয়ালগুলি স্ট্রিং # সমানর চেয়ে দ্রুত। কারণ কোনও বস্তুর উদাহরণ যাচাইয়ের আগে দৈর্ঘ্যের তুলনা করা হয়।


6

contentEquals()পদ্ধতি চেক বিষয়বস্তু একটি মধ্যবর্তী একই হয় String, StringBufferইত্যাদি যা গৃহস্থালির কাজ ক্রম কিছু।


5

বিটিডাব্লু, পার্থক্যের historicalতিহাসিক কারণটি হ'ল স্ট্রিংয়ের মূলত কোনও সুপারক্লাস ছিল না, সুতরাং স্ট্রিং.ইকুয়ালস () একটি স্ট্রিংকে তার যুক্তি হিসাবে গ্রহণ করে। যখন চারসেকেন্সকে স্ট্রিংয়ের সুপারক্লাস হিসাবে পরিচয় করানো হয়েছিল, তখন এটির নিজের একটি সমতা পরীক্ষা দরকার যা সমস্ত চার সিকোয়েন্স বাস্তবায়ন জুড়ে কাজ করেছিল এবং এটি স্ট্রিং দ্বারা ইতিমধ্যে ব্যবহৃত সমান () এর সাথে সংঘর্ষিত হবে না ... সুতরাং আমরা CharSequence.contentEquals পেয়েছি ( ), যা স্ট্রিং দ্বারা উত্তরাধিকার সূত্রে প্রাপ্ত।

চারসেকেন্সটি যদি জাভা ০.০ এ উপস্থিত থাকে তবে আমাদের কেবলমাত্র চারসেকেন্স.ইকুয়াল () থাকতে পারে এবং স্ট্রিং কেবল এটিকে বাস্তবায়ন করতে পারে।

আহ, বিকশিত ভাষাগুলির আনন্দ ...

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