2017-11-27 1 views
2

동일한 밑줄 문자열이있는 두 StringBuilder 개체를 비교할 때 값이 true 일 때도 false이 반환됩니다.StringBuilder가 잘못된 결과를 반환합니다.

public class Test { 

    public static void main(String [] args) { 
     StringBuilder strBld_1 = new StringBuilder("string"); 
     StringBuilder strBld_2 = new StringBuilder("string"); 

     System.out.println(strBld_1.equals(strBld_2)); 
    } 
} 

답변

11

StringBuilderObject 클래스에서 equals 메소드를 오버라이드 (override)하지 않기 때문입니다.

당신은 String에 모두 StringBuilder 개체를 변환해야하고 이것은 당신에게 올바른 결과를 줄 것이다 그들에게

System.out.println(strBld_1.toString().equals(strBld_2.toString()));

를 비교합니다. 물론, 당신은 검사 등 신경해야합니다

equals 계약 사항에 따라

, hashCode도 재정의해야 다음 오버라이드 (override)되어 동일하지만, StringBuffer가 변경 가능한 정도로 그 가치의 변화는 객체의 해시 코드에 영향을 미칠 경우 . StringBuilder을 키로 사용하면 저장된 값 HashMap이 손실 될 수 있습니다.

+1

당신은 equals를 오버라이드하지 않는 것을 암시 적으로 추가 할 수 있습니다. 좋은 답변, 그렇지 않다면 – Stultuske

+1

'CharSequence' 인터페이스 Javadoc은'equals'도 구현되도록 요구하지 않는 것에 대해 몇 가지 단서를 가지고 있습니다. – Thilo

3

여기 더 깊은 대답 : 으로 가정합니다. 클래스에 대한 평등의 의미. 대신 javadoc으로 가서 클래스 equals()을 재정의하는지 먼저 결정하고, 그렇다면 해당 세부 정보를 읽으십시오.

즉, 일치하는 콘텐츠가있는 경우 StringBuilders가 과 같다고 가정합니다.입니다. 그러나 그것은 사실이 아닙니다. 이 클래스는 equals()을 무시하지 않으므로 someBuilder.equals(someBuilder)을 수행 할 때 true 결과 만 수신됩니다. 빌더로 보내진 문자는 빌더를 비교할 때 간단하게 중요하지 않습니다.

관련 문제