문제

서로 다른 StringBuffer 객체가있는 equals () 메소드를 사용할 때마다 결과를 false로 얻지 만 두 개의 다른 문자열 객체와 equals () 메소드를 사용하면 결과를 true로 얻습니다. 왜요?

    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
도움이 되었습니까?

해결책

StringBuffer는 equals ()를 재정의하지 않습니다. 따라서 Object.equals ()가 호출되어 객체 아이덴티티 (메모리 주소)를 비교합니다. 문자열은 동등한 내용을 비교하고 내용을 비교합니다.

다른 팁

StringBuffer 무시하지 않습니다 Object#equals(), 그래서 당신은 경험하고 있습니다 참조 아이덴티티-기반 검사가 아닌 기반 수표 -기반 수표. 이로서 StringBuilder 인스턴스는 각각 다른 메모리 위치를 갖는 것이 뚜렷합니다. Object#equals() 구현은 항상 False를 반환합니다.

Java 6의 정의는 다음과 같습니다.

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

문제가 보이십니까?

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

평등을 위해 두 개의 StringBuffers를 테스트하려면 x.toString (). Equals (y.toString ())로 호출 할 수 있습니다.

당신이 원하는 것이 두 StringBuffer 객체의 문자열 표현을 비교하는 것이면, 당신이하고 싶은 것은 다음과 같습니다.

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의 평등을 비교하고 있습니다. 사물, 해당 내용이 아니라, 즉, 객체#equals (), (존재하지 않는) StringBuffer#equals ()가 아닙니다.

두 객체가 동일 할 때 stringbuffer 객체에서만 true 만 반환합니다. 원하는 방식으로 StringBuffers를 비교하려면 다음을 사용하십시오.

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

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

StringBuffer는 자체 equals 메소드의 구현이 없습니다. 따라서 equals () 메소드의 구현을 제공하는 문자열 객체에 명시 적으로 캐스팅해야합니다.

의 의미론 String 물체는 두 인스턴스가 동일한 순서의 문자를 포함하는 것으로 관찰되면 항상 동일한 순서의 문자를 포함하고 적어도 하나는 String 객체 자체-프로그램 의미론을 변경하지 않고 다른 문자열이있는 문자열 중 하나에 대한 모든 참조를 발표하십시오. 이러한 사례는 모든 실용적 목적을 위해 String 대상 인스턴스에 포함 된 문자 순서입니다.

대조적으로, 유형의 변수 StringBuffer 일련의 문자 일뿐 만 아니라 신원 a 특정한 사례. 두 변수가 동일한 인스턴스를 참조하면 한 변수가 참조하는 인스턴스로 변경하면 다른 인스턴스가 참조하는 인스턴스에 영향을 미칩니다 (동일한 인스턴스이므로). 그들이 다른 인스턴스를 참조하는 경우, 하나에 의해 언급 된 인스턴스의 변경은 다른 사람이 언급 한 인스턴스에 영향을 미치지 않습니다. 자바를 갖지 않기로 한 결정 StringBuffer 우세하다 equals 게으름의 결과는 아니지만 오히려 StringBuffer 물체는 의미있는 정체성을 가지고 있으며, 분리 된 사례는 항상 다른 정체성을 가지고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top