我想要一个关于equals()的简短定义," =="和hashCode()。如果我运行以下代码意味着输出将是" true false 2420395 2420395"。但我明白equals()方法比较字符串和" =="比较参考。但是在输出中,hashCcode()方法打印两个字符串的引用号,就像" =="返回" false"。
String str = "Name";
String str1 = new String("Name");
if(str.equals(str1))
System.out.println("true");
else
System.out.println("false");
if(str==str1)
System.out.println("true");
else
System.out.println("false");
System.out.println(str.hashCode());
System.out.println(str1.hashCode());
}
答案 0 :(得分:15)
当将实现这两种方法的对象添加到集合时, equals()和 hashCode()方法非常重要。如果实施不当,可能会搞砸你的生活。
equals():此方法检查作为参数传递给它的某个其他对象是否等于调用此方法的对象。如果你不理解合同,很容易错误地实现equals()方法。在重写此方法之前,需要牢记以下“属性” -
来自java源代码
*
* @param obj the reference object with which to compare.
* @return {@code true} if this object is the same as the obj
* argument; {@code false} otherwise.
* @see #hashCode()
* @see java.util.HashMap
*/
public boolean equals(Object obj) {
return (this == obj);
}
hashCode():此方法返回一个hashCode()值作为整数,并且支持基于哈希的java.util.Collection类,如Hashtable,HashMap,HashSet等。如果a class重写了equals()方法,它也必须实现hashCode()方法。在重写此方法之前,需要记住
如果两个对象按照equals()方法相同,则在两个对象中的每个对象中调用hashCode()方法必须返回相同的整数结果。所以,如果一个字段没有在equals()中使用,那么它不能在hashCode()方法中使用。
如果两个对象根据equals()方法不相等,则两个对象中的每一个都可以返回两个不同的整数结果或相同的整数结果(即,如果2个对象具有相同的hashCode()结果并不意味着他们是相同的,但如果两个对象相等,那么他们必须返回相同的hashCode()结果。
根据java源代码 尽可能合理,java.lang.Object定义的hashCode方法确实为不同的对象返回不同的整数。 (这通常通过将对象的内部地址转换为整数来实现)
答案 1 :(得分:6)
hashCode()
不会返回对象的引用,而是以某种方式计算对象的哈希。 ==
不会使用hashCode()
的值来比较对象,但正如您所说,通过对象的值来比较&#39}。引用。
答案 2 :(得分:2)
您可以阅读hashCode documentation。简而言之,如果(obj1.equals(obj2)
为真,那么obj1.hashCode()==obj2.hasCode()
必须为真才能成为有效的实现
请注意,这并不意味着两个不同的对象不能共享相同的哈希码。实际上,这个例子是该方法的有效(但可怕)实现:
class MyClass {
public int hashCode() {return 0;}
}
答案 3 :(得分:1)
.equals()
比较字符串的实际内容。
" =="运算符比较两个对象是否在内存中是相同的引用。如果你要做str = str1;
,那么double-equals运算符将返回true
,因为它们指向内存中的相同引用。
hashCode()
以任意方式返回对象的哈希值。只要不以某种方式覆盖该方法,返回的值将始终是唯一的。如果.equals()
返回true,则哈希码应该相同。
答案 4 :(得分:1)
equals()只比较字符串它不检查字符串
的引用但'=='检查参考和数据
在第一种情况下String str =“Name”;只创建了一个对象,但在
中第二种情况创建了两个对象
String str1 = new String("Name");
然后引用与两个字符串不同,这意味着它返回false
答案 5 :(得分:0)
equals()
,并且在JAVA类库提供的某些哈希表类中使用.hashCode()
。答案 6 :(得分:0)
equals()和hashCode()是不同的方法,并且不应该使用hashCode方法来检查两个对象引用是否相同。 原因: hashCode只是返回一个对象的int值,即使两个不同的对象也可以具有相同的hashCode整数。 hashCode()返回的值是对象的哈希码,它是对象的内存地址(十六进制)。 equals()检查两个对象引用是否相同。如果两个对象相等,则它们的hashCode必须相同,但反之则不成立。