重写了equals方法后不一定要重写hashcode()

equals方法是用来干嘛的?

以下是官方说法(来自 JDK API1.7)

<span style="font-size:18px;">Indicates whether some other object is "equal to" this one. </span>
翻译:显示一些其他对象是否“等于”这一个。

hashcode方法是用来干嘛的?

以下是官方说法(来自 JDK API1.7)

<span style="font-size:18px;">Returns a hash code value for the object. This method is supported for the benefit of hash tables such as those provided by java.util.HashMap. </span>
翻译:返回这个对象的hash code值这种方法支持哈希表的好处比如由java.util.HashMap提供(就是便于查找的意思)。

看equals源码

1.在没有重写equals的时候,我们调用对象的equals方法时,都是用的Object类的,

是直接比较内存地址是否一致。没有用到hashcode。源码如下:

<span style="font-size:18px;"><span style="font-size:18px;">public boolean equals(Object obj) {
        return (this == obj);
    }</span></span>


2.重写了equals的方法,以Integer的equals为例,

是直接比较对象内的值是否相等。没有用到hashcode。源码如下:

<span style="font-size:18px;">  public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }</span>

参考源码可得,equals方法跟HashCode方法没有直接关系。

什么时候需要重写hashcode?

AbstractSet类的hashcode方法实现的注释有这么一段

...This ensures that s1.equals(s2) implies that s1.hashCode()==s2.hashCode() for any two sets s1 and s2...

也就是说,AbstractSet这个类的equals方法相等时要求hashcode也相等的。

所以,你只要用了AbstractSet的子类,如HashSet,EntrySet等 

它们判断是否为同一个对象的条件是equals()为true,并且hashcode相等。

以下是从网上弄来的一个例子:

只有同时重写hashcode和equals方法时,Set的里面才只有一个对象。

public class HashTest {
	private int i;

	public int getI() {
		return i;
	}

	public void setI(int i) {
		this.i = i;
	}

	public int hashCode() {
		return i % 10;
	}
	
	public boolean equals(Object object) {  
        if (object == null) {  
            return false;  
        }  
        if (object == this) {  
            return true;  
        }  
        if (!(object instanceof HashTest)) {  
            return false;  
        }  
        HashTest other = (HashTest) object;  
        if (other.getI() == this.getI()) {  
            return true;  
        }  
        return false;  
    }
	public final static void main(String[] args) {
		HashTest a = new HashTest();
		HashTest b = new HashTest();
		a.setI(1);
		b.setI(1);
		Set<HashTest> set = new HashSet<HashTest>();
		set.add(a);
		set.add(b);
		System.out.println(a.hashCode() == b.hashCode());
		System.out.println(a.equals(b));
		System.out.println(set);
	}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值