java基础之 Object

java基础之 Object

Object
hashcode与equals方法,都可以用来比较两个对象是否相等,Object中hashcode返回对象地址,equals比较的是内存地址,hashCode返回的是一个整数,一般情况hashcode计算要比equals简单,使用hash结构存储数据可以达到O(1)时间复杂度,如果直接使用equals循环比较时间复杂度为O(n)。因此使用hash结构存储数据能得到高性能,在hash结构中
1.equals相等的两个对象hashCode一定相等
2.hashCode相等的两个对象equals不一定相等。此时发生hash冲突。可以使用链表存储hash冲突的对象。在HashMap中就是使用组数家链表方式解决hash冲突。
因此约定hashCode方法与equals方法应该具有以上性质。同时由于一般hashCode生成比equals简单。我们在比较两个对象是否相等时可以先用hashcode计算比较两个对象hashcode是否相等,如果不相等则两个对象一定不相等。如果hashcode相等还需调用equals方法做最后比较两个对象是否相等。因此,重写hashcode与equals方法时需要保证以下几点:
重写equals方法一定要重写hashcode方法,保证equals相等时hashcode一定相等。
重写hashcode时无须强制重写equals,hashcode相等equals不一定相等。
String 的hashCode:


 public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;
 
            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }

在存储数据计算hash地址的时候,我们希望尽量减少有同样的hash地址,所谓“冲突”。如果使用相同hash地址的数据过多,那么这些数据所组成的hash链就更长,从而降低了查询效率!所以在选择系数的时候要选择尽量长(31 = 11111[2])的系数并且让乘法尽量不要溢出(如果选择大于11111的数,很容易溢出)的系数,因为如果计算出来的hash地址越大,所谓的“冲突”就越少,查找起来效率也会提高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值