programing

String #equals 메서드와 String #contentEquals 메서드의 차이

prostudy 2022. 8. 30. 21:35
반응형

String #equals 메서드와 String #contentEquals 메서드의 차이

방법과 방법의 차이점은 무엇입니까?

는 String의 내용을 비교할 뿐만 아니라 다른 객체가 다른 객체의 인스턴스인지도 확인합니다.String는 내용(문자 시퀀스)만 비교하고 다른 오브젝트도 다음 오브젝트의 인스턴스인지 아닌지는 체크하지 않습니다.String. a.o. , , , , , 등을 커버하는 실장이라면, 모든 것을 사용할 수 있습니다.

쉽게 말하면, 보다 구현에서 더 자유로울 수 있기 때문에의 똑똑한 형제입니다.

있다, 있다, 따로 있다, 이런 이 있습니다.String.contentEquals()는 다음과 같습니다가장 중요한 이유는 다음과 같습니다.

  • equals방법은 반사적이어야 합니다. '어,어,어,어,어,어,어,어,x.equals(y) == y.equals(x)아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아,aString.equals(aStringBuffer) would would would would would would would would would would would would would 와 같아야 한다aStringBuffer.equals(aString) API 가 Java API Strings의 equals()String Buffer, String Builder CharSequence string string string string 。엉망진창이 될 거야

여기가 바로 그 장소입니다String.contentEquals들어옵니다.이것은 스탠드아론 방식이며 엄격한 요건과 규칙을 따를 필요가 없습니다.Object.equals이것에 의해, 「동일한 컨텐츠의 감각을 보다 자유롭게 실장할 수 있습니다.이를 통해 예를 들어 StringBuffer와 String을 지능적으로 비교할 수 있습니다.

그리고 정확히 무엇이 다른지 말한다면:

  • String.contentEquals()의 할 수 String ,a ,aStringBuilder ,a ,aStringBuffer ,a ,aCharSequence이치노String String 입니다.String.equals()형되되

  • String.equals()스트링 스트링.다른 모든 개체 유형은 동일하지 않은 것으로 간주됩니다.

  • String.contentEquals()가 되다StringBuffer ★★★★★★★★★★★★★★★★★」StringBuilder지적인 방법으로.헤비라고는 할 수 없다.toString()method: 스트링.그 에 깔린 대, 본, 본, 본, 기, 교, 교, 교, instead, instead, instead, instead, instead, insteadchar[]어레이는 훌륭합니다.

이 답변은 이미 dbw에 의해 게시되었지만 그는 삭제했지만 실행 시간을 비교하면서 어떤 예외가 발생했는지에 대한 매우 유효한 점을 가지고 있었습니다.

소스 코드 String #equals String #contentEquals 를 보면, 에는 2 개의 오버라이드 된 메서드가 있습니다.String#contentEqualsStringBuilder 타 andCharSequence.
, ★★★★★★★★★★★★★★★★★★★★★★★★」

  1. String#contentEquals가 "NPE"인 .nullString#equalsfalse
  2. String#equals가 '비교'인 합니다.instance of String 않으면 됩니다.false 다른 String#contentEquals는 인터페이스를 구현하는 모든 객체의 내용을 체크합니다.
  3. , 「」가 되도록 도 있습니다.String#contentEquals 또는 할 경우, 원하는 를 반환할 수 있습니다.equals이지만, 과 같이 할 수 없습니다.String#equals.
    아래 코드는 항상 다음과 같이 생성됩니다.s에는 임의의 ''가 되어 있습니다.string로 3자 길이로 있습니다.

        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#contentEqualsString#Equals가 「」인 .instance of String 양쪽의 String내용은 동일하지만 내용이 동일하지 않습니다.
    문자열이 다음과 같은 경우String s = "madam" ★★★★★★★★★★★★★★★★★」String argPassed = "madan"s.contentEquals(argPassed) 실행 은 이배배 2 배배배2 to to to will will보다 거의 두 배 됩니다.s.equals(argPassed)

  5. 합니다.String#contentEquals 、 「 」보다 퍼포먼스가 향상됩니다.String#Equals가능한 거의 모든 경우에.

그의 대답에 덧붙일 점이 하나 더 있다.

  1. String#contentEqualsString도 「옵션」과됩니다.StringBuilder 및 합니다.String#Equalsfalse
  • String ★★★equals(Object o)는 「」만 합니다.String★★★★★★★★★★★★★★★★★★★★★.contentEquals(CharSequence cs) extensions 。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" 입니다.falsebuilderStringequals()false, ★★★★★★★★★★★★★★★★.contentEquals() 하다, 하다, 하다, 하다, 하다 등의 모든 종류의 합니다.StringBuilder,StringBuffer,String에, 「이러한 것은 아니다」라고 하는 것입니다.true.

  • contentEqualsNullPointerException가 ""인 nullequals()equals()는 instanceOf ( )를 체크하기 때문에 false를 반환한다.인수가 다음과 같으면 false를 반환한다.null.

contentEquals(CharSequence cs):

  • 값의 할 수 .java.lang.CharacterSequence (예:CharBuffer,Segment,String,StringBuffer,StringBuilder)

equals(Object anObject):

  • 을 타입의 할 수 .java.lang.String

RTFC :)

소스를 읽는 것이 그것을 이해하는 가장 좋은 방법이기 때문에 두 가지 방법의 구현을 공유합니다(jdk 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;
 }

String #contentEquals()에는 다른 메서드가 있습니다.

public boolean contentEquals(StringBuffer sb) {
    synchronized(sb) {
        return contentEquals((CharSequence)sb);
    }
}

equals() ★★★★★★★★★★★★★★★★★」contentEquals()에는 두 .String strings ★★★★★★★★★★★★★★★★★」stringStringBuffer.

「 」의 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

contentEquals()는 같은 입니다.String,StringBuffer문자 시퀀스 같은 거 말이야

String #equals는 객체를 인수로 사용하여 String 객체의 인스턴스인지 여부를 확인합니다.인수 객체가 String Object일 경우 콘텐츠를 문자별로 비교합니다.두 문자열 개체의 내용이 동일한 경우 true를 반환합니다.

String #contentEquals는 CharSequence 인터페이스를 인수로 사용합니다.CharSequence는 i) String 클래스 또는 ii) AbstractStringBuilder(StringBuffer의 부모 클래스, StringBuilder)를 사용하여 2가지 방법으로 구현할 수 있습니다.

contentEquals()의 길이는 오브젝트인스턴스 체크 전에 비교됩니다.길이가 같으면 인수 개체가 AbstractStringBuilder 인스턴스인지 여부를 확인합니다.이 경우(StringBuffer 또는 StringBuilder 등) 내용은 문자별로 체크됩니다.인수가 String 객체의 인스턴스인 경우 String#contentEquals에서 String#equals가 호출됩니다.

요컨대

String #equals는 인수가 String 객체인 경우에도 콘텐츠 문자를 문자별로 비교합니다.또한 String #contentEquals는 인수 객체가 CharSequence 인터페이스를 구현하는 경우의 내용을 비교합니다.

String #contentEquals는 String #contentEquals와 같은 길이의 2개의 문자열 콘텐츠를 비교하는 경우 String 개체의 String#equals를 내부적으로 호출하는 경우 속도가 느려집니다.

콘텐츠 길이가 다른 오브젝트('abc'와 'abcd' 등)를 비교하려고 하면 String#contentEquals가 String#equals보다 빠릅니다.오브젝트 인스턴스 체크 전에 길이가 비교되기 때문입니다.

BTW, 지금까지의 차이는 String에 슈퍼클래스가 없었기 때문에 String.equals()는 String을 인수로 받아들이기 때문입니다.CharSequence가 String의 슈퍼클래스로 도입되었을 때는 모든 CharSequence 구현에서 동작하는 자체 동등성 테스트가 필요했습니다.또한 String에서 이미 사용되고 있는 equals()와 충돌하지 않습니다.CharSequence.contentEquals()는 String으로 상속됩니다.

Java 1.0에 CharSequence가 존재하는 경우 Probalby에는 CharSequence.equals()만 있고 String은 단순히 그것을 구현합니다.

아, 진화하는 언어의 즐거움...

언급URL : https://stackoverflow.com/questions/6476600/difference-between-stringequals-and-stringcontentequals-methods

반응형