2009-11-30 3 views
2

두 개의 다른 StringBuffer 개체와 함께 equals() 메서드를 사용할 때마다 결과가 false가되지만 두 개의 다른 String 개체에 equals() 메서드를 사용하면 결과가 true가됩니다. 왜?equal 메서드와의 혼동

String s=new String("434"); 
    String s1=new String("434"); 

    System.out.println(s.equals(s1));//true 

    StringBuffer s=new StringBuffer("434"); 
    StringBuffer s1=new StringBuffer("434"); 

    System.out.println(s.equals(s1));//false 

답변

15

StringBuffer는 equals()를 재정의하지 않습니다. Object identity (메모리 주소)를 비교하는 Object.equals()가 호출됩니다. String은 equals를 재정 의하여 내용을 비교합니다.

+0

OOC, how * DO * 실제 객체가 비교되는 문자열에 대해 equals의 기본 구현을 사용하게됩니까? –

+0

'=='연산자를 사용하여 객체 참조가 동일한 지 비교합니다. – seh

+0

StringBuffer.equals() 메소드가 구현되지 않은 이유가 있습니까? –

1

문자열 s.equals는 문자열 테이블을 사용하여 StringBuffer sb.equals가 equals 메소드의 기본 구현을 사용하고 객체 포인터를 비교하는 실제 문자열을 비교합니다.

2

적어도 JDK (Sun 1.6) 버전에서 StringBuffer는 equals() 메소드를 구현하지 않습니다. 이는 Object의 equals() 메서드를 상속 받았다는 것을 의미합니다.이 메서드는 ==

과 동일합니다. 실제로 두 개의 StringBuffer를 동일한 것으로 테스트하려면 x.toString(). equals (y.toString())

을 호출 할 수 있습니다.
3

StringBufferObject#equals()를 오버라이드 (override)하지 않는, 그래서 당신은 아닌 기반 검사 참조 정체성 기반 검사를 겪고 있습니다. 이 StringBuilder 인스턴스는 서로 다른 메모리 위치를 가지므로 기본 Object#equals() 구현은 항상 false를 반환합니다.

여기에 정의는 자바 6의로이다 :

public boolean equals(Object obj) { 
    return (this == obj); 
} 

문제를 참조하십시오? 무엇을 당신이 찾고있는 것은 두 StringBuffer와 객체의 문자열 표현을 비교하는 경우

+0

이 전체 대화에서 ... 나는 당신의 답만을 이해할 수있었습니다. – Hariharbalaji

2

하고 싶은 것은 :

StringBuffer sb1 = new StringBuffer("434"); 
StringBuffer sb2 = new StringBuffer("434"); 
if (sb1.toString().equals(sb2.toString())) { 
    // whatever you want to do if they're equal 
} else { 
    // whatever you want to do if they're not 
} 

그렇지 않으면, 당신은 두 StringBuffer를 의 지 어떤지를 비교하는 객체이 아닌 내용을 반환합니다. 즉, 존재하지 않는 StringBuffer # equals()가 아니라 Object # equals()를 실행해야합니다.

+0

'StringBuffer # toString()'에 대한 각각의 호출은 기본 문자 배열의 새로운 복사본을 생성합니다. 나중에 버퍼 중 하나에 대한 액세스가 필요하다면 'toString()'에 대한 첫 번째 호출에서 참조를 저장하고 다시 사용하는 것이 좋습니다. – seh

2

같음은 두 객체가 같을 때만 StringBuffer 객체에서 true를 반환합니다. StringBuffers 당신이 원하는 방식을 비교하려면 다음을 사용 :

System.out.println(s.toString().equals(s1.toString()); 
0

StringBuffer를이없는이 equals 메소드의 자신 실현하는 것이입니다 따라서 hashvalues ​​비교보다는 실제를 비교하고는 객체 클래스에서() 메소드를 등호를 상속 stringBuffer의 내용 따라서 equals() 메소드에 대한 구현을 제공하는 문자열 객체에 명시 적으로 캐스트해야합니다.

0

String 객체의 의미는 두 인스턴스가 동일한 문자 시퀀스를 포함하는 것으로 관찰되는 경우 항상 동일한 문자 시퀀스를 포함하고 하나는 적어도 String 객체의 관점에서 볼 수 있습니다 자체 - 프로그램 의미를 변경하지 않고 문자열 중 하나에 대한 모든 참조를 다른 참조로 대체합니다. 모든 실제 목적을 위해 String의 인스턴스에 캡슐화 된 유일한 정보는 대상 인스턴스에 포함 된 문자 시퀀스이기 때문에 그러한 인스턴스는 동등한 것으로 간주 될 수 있습니다.반대로

는 입력 StringBuffer 가변 일련의 문자뿐만 아니라 특정 인스턴스의 신원 아니라 캡슐화. 두 변수가 동일한 인스턴스를 참조하는 경우 한 변수가 참조하는 인스턴스로 변경하면 다른 인스턴스가 참조하는 인스턴스에 영향을줍니다 (동일한 인스턴스이므로). 다른 인스턴스를 참조하는 경우 하나가 참조하는 인스턴스를 변경해도 다른 인스턴스가 참조하는 인스턴스에는 영향을주지 않습니다. 자바의 StringBuffer을 오버라이드하지 않기로 한 결정은 게으름의 결과가 아니고, StringBuffer 객체가 의미있는 ID를 가지고 있으며, 분리 된 인스턴스는 항상 다른 ID를가집니다.