0

hashCode()equals()メソッドはオーバーライドされませんでしたStringBufferStringBuilder私は以下のコードを試していました。

    //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、文字列の場合は2です。文字列はandメソッドをオーバーライドしているためStringBuffer、アドバイスしてください。StringBuilderhashCode()equals()

4

4 に答える 4

5

StringBuilder/StringBuffer は、値を格納するためではなく、より効率的な文字列操作のために作成されました。したがって、それをキーとして使用したり、バージョンを実装したりしないでください。または、単にそれを呼び出しますtoString

于 2012-04-28T06:48:54.457 に答える
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) を作成した場合、エントリは 1 つしかなく、s2 を変更するとどうなるでしょうか? 現在、1 つまたは 2 つのエントリがありますか?

StringBuilder の場合、内容が変更される可能性があるため、その hashCode と equals はこれに依存しないため、デフォルトの実装のみが含まれます。

于 2012-04-28T07:32:47.787 に答える
0

Paul Vargas が言うように、StringBuffer/StringBuilder は変更可能です。

これは、2 つの StringBuilders または 2 つの StringBuffers が実際に同じインスタンスでない限り、真に等しいとは言えないことを意味します。したがって、同一性による同等性が最も適切なセマンティックです。

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

値による等価セマンティクスを持つ「変更可能な文字列」クラスが本当に必要な場合は、いつでもAbstractStringBuilder... のコードをコピーするか、ゼロから実装することができます。

于 2012-04-28T07:29:42.977 に答える
0

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

于 2012-04-28T07:15:44.677 に答える