Java equals()和hashCode()之间的差异
我想要一个关于equals(),“==”和hashCode()的简短定义。如果我运行以下代码,则表示输出为“true false 2420395 2420395”。但是我知道equals()方法比较字符串,“==”比较引用。但是在输出中,hashCcode()方法将两个字符串的引用号打印为相同的,那么为什么“==”返回“false”Java equals()和hashCode()之间的差异,java,string,compare,equals,Java,String,Compare,Equals,我想要一个关于equals(),“==”和hashCode()的简短定义。如果我运行以下代码,则表示输出为“true false 2420395 2420395”。但是我知道equals()方法比较字符串,“==”比较引用。但是在输出中,hashCcode()方法将两个字符串的引用号打印为相同的,那么为什么“==”返回“false” hashCode()不返回对象的引用,而是以某种方式计算的对象的哈希值=不使用hashCode()的值来比较对象,但是,正如您正确地说的,通过对象引用的值来比较对象
hashCode()
不返回对象的引用,而是以某种方式计算的对象的哈希值=
不使用hashCode()
的值来比较对象,但是,正如您正确地说的,通过对象引用的值来比较对象。您可以阅读。简单地说,如果(obj1.equals(obj2)
是真的,那么obj1.hashCode()==obj2.hasCode()
必须是真的,才能成为有效的实现
请注意,这并不意味着两个不同的对象不能共享相同的哈希代码。实际上,此示例是该方法的一个有效(但糟糕)实现:
class MyClass {
public int hashCode() {return 0;}
}
.equals()
比较字符串的实际内容
“==”运算符比较两个对象是否是内存中的相同引用。如果要执行str=str1;
,则双等于运算符将返回true
,因为它们指向内存中的相同引用
hashCode()
以任意方式返回对象的哈希值。只要该方法未被某种方式重写,则返回的值将始终是唯一的。如果.equals()
返回true,则哈希代码应相同
.hashCode()时,会使用equals()
用于JAVA类库提供的一些哈希表类- 自反式:o1。等于(o1)-这意味着一个对象(例如o1)应该等于它自己
- 对称:o1.equals(o2)当且仅当o2.equals(o1)
- 及物:o1.equals(o2)&&o2.equals(o3)也意味着o1.equals(o3)
- 一致性:o1。只要o1和o2未被修改,equals(o2)返回相同的值
- null比较:!o1.equals(null)-这意味着任何可实例化对象都不等于null。因此,如果将null作为参数传递给对象o1,则它应返回false
- 哈希代码值:o1.equals(o2)表示o1.hashCode()==o2.hashCode()。这非常重要。如果定义equals()方法,则还必须定义hashCode()方法。此外,这意味着如果有两个相等的对象,则它们必须具有相同的哈希代码,但反之则不成立
*
* @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等)支持此方法。如果类重写equals()方法,则必须实现hashCode()方法。在重写此方法之前,您需要记住
- 在Java程序的执行过程中,每当对同一对象多次调用hashCode()方法时,此方法必须一致地返回相同的结果。从程序的一次执行到同一程序的下一次执行,整数结果不必保持一致
- 如果两个对象按照equals()方法相等,那么在两个对象中调用hashCode()方法必须返回相同的整数结果。因此,如果equals()中未使用字段,则hashCode()方法中不得使用该字段
- 如果两个对象按照equals()方法不相等,则两个对象中的每个对象都可以返回两个不同的整数结果或相同的整数结果(即,如果两个对象具有相同的hashCode()结果并不意味着它们相等,但如果两个对象相等,则它们必须返回相同的hashCode()结果)
String str1 = new String("Name");
然后,两个字符串的引用不相同,这意味着它返回falseequals()和hashCode()是不同的方法,不应使用hashCode方法检查两个对象引用是否相同。
原因:hashCode只返回一个对象的int值,即使两个不同的对象也可以具有相同的hashCode整数。hashCode()返回的值是对象的哈希代码,它是对象的十六进制内存地址。
相等
String str1 = new String("Name");