2012-04-28 17 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で取得ミリアンペア来る..下記のコードのこの部分をしようとしていたStringBufferまたはStringBuilder 2文字列の場合は、文字列がhashCode()equals()の方法より優先されるので、助言してください。

答えて

5

StringBuilder/StringBufferは、ストア値ではなく、より効率的な文字列操作のために作成されました。したがって、キーとして使用したり、バージョンを実装したりするべきではありません。または単にtoStringと呼んでください。

+0

StringBuilderには、割り当てを避けるためにCharSequenceを使用するなど、equalsが役に立ちそうな用途があります。それは実装されていないことは残念です。 – NateS

0

StringBuilderおよびStringBufferは可変文字列であり、Stringは不変です。

0

Paul Vargas氏によると、StringBuffer/StringBuilderは変更可能です。

これは、実際には同じインスタンスでない限り、2つのStringBuilderまたは2つのStringBufferが真に等しいとは言えないことを意味します。したがって、同一性による平等が最も適切な意味論である。

StringBuffersとStringBuildersが変更可能であるという事実は、値ベースのキーなどとしての使用には適していないということも意味します。まず文字列を作成する必要があります。

値の意味が等しい「可変文字列」クラスが本当に必要な場合は、いつもAbstractStringBuilderのコードをコピーするか、ゼロから実装します。

+0

こんにちはスティーブン、ありがとう、私はAbstractStringBuilderを拡張し、hascode()とequals()をオーバーライドするカスタムクラスを作成する必要があります。 – dghtr

+0

オブジェクトが変更可能であるという理由だけで、イコールを無視する必要はありません。 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を変更したとき、何が起こるのでしょうか?今、1〜2つのエントリーがありますか?

StringBuilderの場合、コンテンツが変更される可能性があるため、hashCodeとequalsはこれに依存しないため、デフォルトの実装のみを保持します。

関連する問題