Java hashCode方法的简单解析

以前在学校学习过哈希算法,但一直对JAVA中的hashCode()方法以及其做法不甚了解.今天上网查了下,发现原来JAVA中的非重复集合都是散列存储的.在判断是否重复方面,哈希算法有其天然优势——相对equals()来说~

equals()和hashcode()这两个方法都是从object类中继承过来的。 

equals()方法在object类中定义如下: 


public boolean equals(Object obj) { 
return (this == obj); 
}

 

既比较其引用值是否相等。但是在封装类中是被重写的,这些早就知道就不说了。

 

但是当自己写个新TYPE时,如果要重写equals() , then we shall noting the following tips which I found on the www:

 

• 对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”。 

 

• 反射性:x.equals(x)必须返回是“true”。 
• 类推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”。 
• 还有一致性:如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是“true”。 
• 任何情况下,x.equals(null),永远返回是“false”;x.equals(和x不同类型的对象)永远返回是“false”。 

以上这五点是重写equals()方法时,必须遵守的准则,如果违反会出现意想不到的结果。

 

hasCode() 在Objectr的API中定义如下:

 

public native int hashCode(); 

 

但以后的包装类中都覆盖了该方法,但基本的原则是:

 

equals()相等的两个对象,hashcode()一定相等;equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。换句话说,equals()方法不相等的两个对象,hashcode()有可能相等。这个现象很明显是由于散列算法本身的散列值冲突决定的。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值