黑马程序员技术交流社区

标题: String类的HashCode()方法 [打印本页]

作者: 原满    时间: 2013-5-31 00:30
标题: String类的HashCode()方法
public int hashCode() {
    int h = hash;
    if (h == 0) {
        int off = offset;
        char val[] = value;//字符数组表示字符串
        int len = count;//字符串字符个数

            for (int i = 0; i < len; i++) {
                h = 31*h + val[off++];
            }
            hash = h;
        }
        return h;
    }
上面是String类的HashCode() 方法的源码,问题是,当字符串无限长的时候,这个for循环计算得到hashCode不会越界么?
作者: Super_Class    时间: 2013-5-31 07:35
会。而且比串的长度先越界
作者: 花心々小土豆    时间: 2013-5-31 12:02
好家伙,看了这问题我都凌乱了!我觉得楼主可能不太清楚哈希表的存储结构,下面来一个数据结构中的哈希表存储的标准定义:
以线性表中的每个元素的某个数据项(最好是关键字)Key为自变量,使用一种事先选定的函数H(Key)计算出函数值,将该值解释为一块连续存储空间(如数组空间)的单元地址(如数组的下标),将数据元素存储到该单元中。
下面说点大家都能听懂的,假如在a[10]中存入1,2,4,5,7值,哈希表会事先选定一个函数,假设该函数为H(Key)=key*3,即每个要存如的值先乘以3,然后再和数组大小求余,找到对应下标存入。这个函数我们可以自己设置(不一定要乘以某个数,可以加入平方,立方,求余,怎么爽怎么来,目的是为了避免两个值对应同一个下标产生冲突),乘以300都没问题,因为和数组求余以后它的值和数组下标是对应的,估计楼主担心的是这个函数值太大会怎么怎么!
Java中HashCode()就相当上面的选定的函数。
那么如果真的遇到冲突怎么办?数据结构中提供了两种方法,开放地址法,链接发。Java中采用的就是链接发,即如果H(Key)值相同时,用单链表存储,该数组下标中存入的是指向单链表的指针。
当HashCode()值相同是,就要用到 equals() 方法。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2