2012-04-28 2 views
0

hashCode()equals() 방법 StringBufferStringBuilder에서 재정의되지 않은, 나는StringBuffer 및 StringBuilder에서 메서드가 재정의되지 않았습니까?

//StringBuffer does not override equals & hashCode 
     //StringBuffer s = new StringBuffer("saral"); 
     //StringBuffer s1 = new StringBuffer("saral"); 

     StringBuilder s = new StringBuilder("saral"); 
     StringBuilder s1 = new StringBuilder("saral");   

     //String s = new String("saral"); 
     //String s1 = new String("saral"); 

     HashSet set=new HashSet(); 
     set.add(s); 
     set.add(s1); 
     set.add(null); 
     System.out.println("There are "+set.size()+" elements in the set."); 

아웃 된 결과는 내가 사용하는 경우 모두 3 점점 MA 올 .. 아래에이 코드 조각을 시도하고 있었다 StringBuffer 또는 StringBuilder 그러나 문자열의 경우 2는 문자열이 hashCode()equals() 메서드보다 우선하므로 무시하십시오.

답변

5

StringBuilder/StringBuffer는 저장 값이 아닌보다 효율적인 문자열 연산을 위해 만들어졌습니다. 따라서 키로 사용하거나 버전을 구현해서는 안됩니다. 또는 toString으로 전화하면됩니다.

+0

StringBuilder에는 CharSequence를 사용하여 할당을 피하는 것과 같이 equals가 유용한 다른 용도가 있습니다. 그것은 구현되지 않은 것은 불행한 일입니다. – NateS

0

StringBuilderStringBuffer은 변경 가능한 문자 시퀀스이며 String은 변경할 수 없습니다.

0

Paul Vargas가 말한 것처럼 StringBuffer/StringBuilder는 변경할 수 있습니다.

두 개의 StringBuilder 또는 두 개의 StringBuffer는 실제로 같은 인스턴스가 아니면 동등하다고 말할 수 없습니다. 따라서 정체성에 의한 평등이 가장 적절한 의미론이다.

StringBuffers 및 StringBuilder가 변경 가능하다는 사실은 또한 값 기반 키 등으로 사용하기에 적합하지 않다는 것을 의미합니다. 문자열을 먼저 만들어야합니다.

값이 의미가 같은 "변경 가능한 문자열"클래스가 정말로 필요하다면 항상 AbstractStringBuilder ... 코드를 복사하거나 처음부터 다시 구현할 수 있습니다.

+0

안녕하세요, 스티븐, 덕분에 당신이 AbstractStringBuilder를 확장하고 hascode()와 equals()를 오버라이드하는 커스텀 클래스를 만들어야한다고 말하고 싶습니다. – dghtr

+0

객체가 변경 가능하다고해서 그것이 equals 구현을 무시해야한다는 것을 의미하지는 않습니다. AbstractStringBuilder는 char []를 노출하지 않습니다. – NateS

+0

@NateS - 누구나 똑같이 구현하지 않아야한다고 말하지 않았습니다. 제가 말한 것은 정체성에 의한 평등이 이러한 클래스들에 대한 평등의 가장 적절한 정의라는 것입니다. 제가 downvoting하기 전에 무슨 말인지 이해하려고하십시오. –

1

hashCode, equals 또는 compareTo는 개체를 컬렉션에 추가 한 후에 변경 될 수 있습니다. 예 :

StringBuilder s1 = new StringBuilder("saral"); 
StringBuilder s2 = new StringBuilder("saral");   

HashSet set = new HashSet(); 
set.add(s1); 
set.add(s2); 
assert set.size() == 2; 

s2.append("-two"); 
assert set.size() == 2; 

당신이 한 경우 s1.equals (S2)가 하나의 항목 만있을 것입니다 그리고 당신은 S2가 변경 될 때, 어떤 일이 일어날까요? 지금 한두 개의 항목이 있습니까?

StringBuilder의 경우 내용이 변경되어 hashCode 및 equals가이 값에 종속되지 않으므로 기본 구현 만 있습니다.

관련 문제