なぜStringBuffer/StringBuilderはオブジェクトのequals()
,hashcode()
メソッドをオーバーライドしませんか?StringBuffer/StringBuilderがequalsまたはhashCodeをオーバーライドしないのはなぜですか?
私を提案してください変更可能である
なぜStringBuffer/StringBuilderはオブジェクトのequals()
,hashcode()
メソッドをオーバーライドしませんか?StringBuffer/StringBuilderがequalsまたはhashCodeをオーバーライドしないのはなぜですか?
私を提案してください変更可能である
StringBuffer
ので、問題を理解するのに役立ちます鮮明な画像...、そしてその主な用途はが文字列を構築するためです。コンテンツを比較する場合は、StringBuffer#toString()
に電話し、戻り値を比較してください。
HashMap
のキーとして使用されるオブジェクトを変更すると、格納された値が "失われる"可能性があるため、可変オブジェクトの場合はhashCode()
を無効にすることは一般的には役に立ちません。
実際にこのすべての背後にあるのは、ハッシュコードのコード値に依存します。
String str1 = new String("sunil");
String str2 = new String("sunil");
HashMap hm = new HashMap()
hm.put(str1,"hello");
hm.put(str2,"bye");
最終HM:この概念は、例を取ることができます理解するために
hm = { sunil=bye }
を上記のコードでは、STR1とstr2は、二つの異なるStringオブジェクトです。それはHashMapで追加する必要がありますか?回答はです。です。 HashMapに値を挿入する前に、hashCodeの値がstr1,str2であるかどうかを内部的にチェックして比較します。 Stringクラスはequals()メソッドとhashcode()メソッドをオーバーライドするため、両方とも同じhascode値を返します。したがって、hm.put(str2,"bye");
の最初のキーを実行すると、新しい値で上書きされます。今、これを試してみてください。
StringBuilder sb1 = new StringBuilder("sunil");
StringBuilder sb2 = new StringBuilder("sunil");
HashMap hm = new HashMap()
hm.put(sb1,"hello");//sb1 and sb2 will return different HashCode
hm.put(sb2,"bye");// StringBuffer/StringBuilder does not override hashCode/equals methods
最終HM:SB1とSB2の両方が異なるハッシュコードを返しますので、
{sunil=hello, sunil=bye}
どちらの値はハッシュマップに追加されます。 StringBuilder/StringBufferは、equals()およびhashCode()メソッドをオーバーライドしません。
Sun社は、Hashtableのか(HashSetの、HashMapの...)好きな他のハッシュコレクション内の値の2つの異なる文字列の種類を追加できるようにするプログラマを望んでいた、それはStringBufferの中に意図的に上書きされなかった理由のhashCode()とequals()のです、StringBuilderクラス
'Sun Microsystemは、プログラマが2つの異なるString型の値をHashtableに追加できるようにしたかった。' 'Hashtable'のjavadocs(https:// docs。 oracle.com/javase/8/docs/api/java/util/Hashtable.html)と['Map'](https://docs.oracle。com/javase/8/docs/api/java/util/Map.html)は、壊れた 'equals/hashcode'契約を持つオブジェクトをキーとして使用することを積極的に阻止します。 'StringBuilder'オブジェクトをマップに格納することは、元のオブジェクトを持たない限り、キーで値を取得できないためには役に立ちません。 –
StringBufferがであるため、です。例を試してみてください:)
package test;
import java.util.HashMap;
public class CheckHashcodeEquals {
public static void main(String[] args) {
/*
* String class override equals() and hashcode() method thats way
* override value of HashMap
*/
String s1 = new String("Arya");
String s2 = new String("Arya");
HashMap hm = new HashMap<>();
hm.put(s1, "A1");
hm.put(s2, "A2");
System.out.println(hm); /* Output: {Arya=A2} */
/*
* String class does not override equals() and hashcode() method thats
* way insert duplicate value
*/
StringBuffer sb1 = new StringBuffer("Arya");
StringBuffer sb2 = new StringBuffer("Arya");
HashMap hm2 = new HashMap<>();
hm2.put(sb1, "A1");
hm2.put(sb2, "A2");
System.out.println(hm2); /* Output: {Arya=A2, Arya=A1} */
}
}
この例は、 'StringBuffer'が' equals'と 'hashcode'をオーバーライドしないが、なぜそれを示していないかを示しています。答え自体( 'StringBufferは変更可能であるため')は以前の回答からコピーされます。 –
ここでは変更が何を意味していますか? – Saravanan
あなたは非常に基本的な原則を理解していない場合、いくつかの研究を行います:http://stackoverflow.com/questions/3554192/what-is-a-mutable-class-in-oop –
私はあなたの声明_可変オブジェクトのhashCode()をオーバーライドするのは一般的に有用ではありません... _ – Shahzeb