Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么StringBuffer/StringBuilder不重写equals或hashCode?_Java_Oop - Fatal编程技术网

Java 为什么StringBuffer/StringBuilder不重写equals或hashCode?

Java 为什么StringBuffer/StringBuilder不重写equals或hashCode?,java,oop,Java,Oop,为什么StringBuffer/StringBuilder不重写对象中的equals(),hashcode()方法 请给我一张清晰的图片,帮助我理解问题…因为StringBuffer是可变的,它的主要用途是构造字符串。如果要比较内容,请调用StringBuffer#toString()并比较返回的值 对于可变对象重写hashCode()通常是没有用的,因为修改在HashMap中用作键的对象可能会导致存储值“丢失”。实际上,这背后的一切都取决于hashCode值。为了理解这个概念,让我们举一个例子

为什么StringBuffer/StringBuilder不重写对象中的
equals()
hashcode()
方法


请给我一张清晰的图片,帮助我理解问题…

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


对于可变对象重写
hashCode()
通常是没有用的,因为修改在
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 }
{sunil=hello, sunil=bye}
在上面的代码中,str1和str2是两个不同的字符串对象。它们是否应该单独添加到HashMap中?答案是否定的。这是因为在HashMap中插入/放入值之前,它会在内部检查并比较str1str2的hashCode值。两者都返回相同的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
最终hm:

hm = { sunil=bye }
{sunil=hello, sunil=bye}
这两个值都将添加到hashMap中,因为sb1和sb2都返回不同的hashcode。StringBuilder/StringBuffer不重写equals()和hashCode()方法


Sun Microsystem希望程序员允许在哈希表或任何其他哈希集合(如HashSet、HashMap…)中添加2种不同的字符串类型的值,这就是为什么在StringBuffer、StringBuilder类中hashCode()和equals()没有被有意重写的原因。

因为StringBuffer是可变的。举个例子:)

封装测试;
导入java.util.HashMap;
公共类CheckHashcodeEquals{
公共静态void main(字符串[]args){
/*
*String类重写equals()和hashcode()方法
*覆盖HashMap的值
*/
字符串s1=新字符串(“Arya”);
字符串s2=新字符串(“Arya”);
HashMap hm=新的HashMap();
hm.put(s1,“A1”);
hm.put(s2,“A2”);
System.out.println(hm);/*输出:{Arya=A2}*/
/*
*String类不重写
*方法插入重复值
*/
StringBuffer sb1=新的StringBuffer(“Arya”);
StringBuffer sb2=新的StringBuffer(“Arya”);
HashMap hm2=新的HashMap();
hm2.put(sb1,“A1”);
hm2.put(sb2,“A2”);
System.out.println(hm2);/*输出:{Arya=A2,Arya=A1}*/
}
}

Mutable在这里意味着什么?如果你不了解最基本的原则,请做一些研究:恕我直言,我不同意你的说法,为可变对象重写hashCode()通常是没有用的…@Shahzeb举个例子,说明可变对象的
hashCode()
可能会被使用吗?对我来说,第一个明显的参考点是任何ORM类,这里有一个链接,这里有一个很长的讨论,所以这个示例演示了
StringBuffer
不会覆盖
equals
hashcode
,但没有说明原因。答案本身(
,因为StringBuffer是可变的
)是从前面的答案复制而来的。
Sun Microsystem希望程序员允许在哈希表中添加两种不同的字符串类型的值…
这不是真的,javadocs支持并积极阻止使用带有损坏的
equals/hashcode
契约的对象作为键。将
StringBuilder
对象存储在地图中没有任何用处,因为除非您拥有原始对象,否则无法通过键获取值。