为什么 StringBuffer/StringBuilder 不覆盖 equals 或 hashCode?

2022-09-01 10:42:07

为什么 StringBuffer/StringBuilder 不覆盖 object 中的 方法?equals()hashcode()

请建议我清晰的图片,以帮助理解问题...


答案 1

因为 是可变的,其主要用途是构造字符串。如果要比较内容,请调用并比较返回值。StringBufferStringBuffer#toString()

重写可变对象通常没有用处,因为修改在 中用作键的此类对象可能会导致存储的值“丢失”。hashCode()HashMap


答案 2

实际上,在这背后,一切都取决于哈希码代码值。为了理解这个概念,让我们举个例子:

String str1 = new String("sunil");
String str2 = new String("sunil");

HashMap hm = new HashMap()
hm.put(str1,"hello");
hm.put(str2,"bye");

最终嗯:

hm = { sunil=bye }

在上面的代码中,str1 和 str2 是两个不同的 String 对象。是否应将它们单独添加到哈希映射中?答案是否定的。这是因为在 HashMap 中插入/放置值之前,它会在内部检查并比较 str1str2 的 hashCode 值。两者都返回相同的哈希码值,因为 String 类覆盖了 equals() 和 hashcode() 方法。因此,在执行时,第一个键将被新值覆盖。现在试试这个: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

最终嗯:

{sunil=hello, sunil=bye}

这两个值都将添加到 hashMap 中,因为 sb1 和 sb2 都返回不同的哈希码。StringBuilder/ StringBuffer 不覆盖 equals() 和 hashCode() 方法。

Sun Microsystem希望程序员允许在Hashtable或任何其他Hash集合(HashSet,HashMap...)中添加2种不同的字符串类型的值,这就是为什么hashCode()和equals()在StringBuffer,StringBuilder类中没有故意覆盖的原因。