java那些事之hashCode

学习java看懂java的API是至关重要的,所以首先让我们先看看java是怎么解释hashCode的;

          返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能

一句话让我们了解了java设计hashCode的主要目的就是提高诸如hashMap,hashTable这些哈希表的性能,所以hashCode的好方法,使用需谨慎啊!

再看看自己重写hashCode 的常规协定是:

  • 在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
  • 如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。
  • 如果根据equals(java.lang.Object)方法,两个对象不相等,那么对这两个对象中的任一对象上调用hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。

这些协定是我们重写hashCode方法时需要注意的细节,同时根据这些协定也可以帮助理解Object子类重写的hashCode方法的具体功能。

来看一看String重写的hashCode方法的源代码:

private int hash; 
public String(String original) {
        this.value = original.value;
        this.hash = original.hash;
    }
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就是一个int型变量,默认值是0;
从以上代码可得hashCode的计算是这样的:s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1],又有人会问了,中间为什么要乘以31啊,这个疑问我也想到了,有人讲31的二进制全是1,然后可以有效的离散数据,这个我也没法解释,那哥们也没有解释,希望看到的可以讨论一下。

这也是String比较简单的重写hashCode方法的,看的就很费劲了,所以hashCode方法还是比较复杂的。但是只要看懂了hashCode的协议,和设计hashCode方法的目的,我们也能明白hashCode方法的功能,知道其功能也就能更好的利用hashCode方法写出更多简洁的代码了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值