zoukankan      html  css  js  c++  java
  • 关于Java中String类的hashCode方法

    首先来看一下String中hashCode方法的实现源码

     1 public int hashCode() {
     2     int h = hash;
     3     if (h == 0 && value.length > 0) {
     4         char val[] = value;
     5 
     6         for (int i = 0; i < value.length; i++) {
     7             h = 31 * h + val[i];
     8         }
     9         hash = h;
    10     }
    11     return h;
    12 }

    在String类中有个私有实例字段hash表示该串的哈希值,在第一次调用hashCode方法时,字符串的哈希值被计算并且赋值给hash字段,之后再调用hashCode方法便可以直接取hash字段返回。

    String类中的hashCode计算方法还是比较简单的,就是以31为权,每一位为字符的ASCII值进行运算,用自然溢出来等效取模。

    哈希计算公式可以计为s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

    关于为什么取31为权,可以参考StackOverflow上的这个问题

    主要是因为31是一个奇质数,所以31*i=32*i-i=(i<<5)-i,这种位移与减法结合的计算相比一般的运算快很多。

    字符串哈希可以做很多事情,通常是类似于字符串判等,判回文之类的。

    但是仅仅依赖于哈希值来判断其实是不严谨的,除非能够保证不会有哈希冲突,通常这一点很难做到。

     

    就拿jdk中String类的哈希方法来举例,字符串"gdejicbegh"与字符串"hgebcijedg"具有相同的hashCode()返回值-801038016,并且它们具有reverse的关系。这个例子说明了用jdk中默认的hashCode方法判断字符串相等或者字符串回文,都存在反例。

  • 相关阅读:
    pythonldap 简单试用
    shell 将文件名读入数组
    pytest命令行传入自定义的参数到测试文件中
    Python实现在不同Linux主机之间拷贝文件
    使用minio搭建私有化对象存储服务
    CPU/GPU/NPU
    pytest 内置和自定义marker
    安装SQLite3引发的库问题
    C标准库——程序员等级
    这样还弄不死指针?
  • 原文地址:https://www.cnblogs.com/bsjl/p/8626581.html
Copyright © 2011-2022 走看看