什么时候 hashCode() 与 equals() 应该同时覆写!

当某个类的对象作为HashMapkey时,必须同时覆写equals()hashCode方法

更加一般意义的是:只要某各类结合基于散列的集合一起使用,那么就必须同时覆写equals()HashCode方法

否则就会被Object hashCode方法所干扰!

 

采用e.hash == hash判断hashCode()是出于效率考虑,短路与!

HashMapget()方法!

    public V get(Object key) {

        if (key == null)

            return getForNullKey();

        int hash = hash(key.hashCode());

        for (Entry<K,V> e = table[indexFor(hash, table.length)];

             e != null;

             e = e.next) {

            Object k;

            if (e.hash == hash && ((k = e.key) == key || key.equals(k)))

                return e.value;

        }

        return null;

}

 

 

 

 

 

thinking in javahashmap中说,如果key是自定义的类,那么必须得重载equals()hashcode()两个方法

 

一般来说,如果你要把一个类的对象放入容器中,那么通常要为其重写equals()方法,让他们比较地址值而不是内容值。特别地,如果要把你的类的对象放入散列中,那么还要重写hashCode()方法;要放到有序容器中,还要重写compareTo()方法

 

 

java的集合中,判断两个对象是否相等的规则是:


首先,判断两个对象的hashCode是否相等


如果不相等,认为两个对象也不相等

如果相等,则判断两个对象用equals运算是否相等

如果不相等,认为两个对象也不相等

如果相等,认为两个对象相等




我们在equals方法中需要向下转型,效率很低,所以先判断hashCode方法可以提高效率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值