A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张榆 中级黑马   /  2012-9-8 00:51  /  2318 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

问问,相同的字符串可能会有不同的HashCode吗?相同的字符串每次生成的HashCode都相同吗?


评分

参与人数 1技术分 +1 收起 理由
创出一片辉煌 + 1 新人!这种问题,视频讲解很详细.

查看全部评分

5 个回复

倒序浏览
相同的字符串的hashcode必然相同 因为都是用hash算法算的嘛


hashcode是由Hash算法得出来的,根据字符串的值算出来的,每次算出来的结果都相同

1.jpg (31.06 KB, 下载次数: 58)

1.jpg
回复 使用道具 举报
分析相同两个字符串对象的HashCode是不是相同,应该看看String类中复习的hashCode()方法
根据API:
public int hashCode()返回此字符串的哈希码。String 对象的哈希码根据以下公式计算:
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
使用 int 算法,这里 s 是字符串的第 i 个字符,n 是字符串的长度,^ 表示求幂。(空字符串的哈希值为 0。)

发现,你的两个字符串对象转换成字符数组之后,其数组中的每个元素都是相同的。
根据上边的计算公式可知,两个相同字符串的HashCod是相同的。

回复 使用道具 举报
1相同的字符串可能会有不同的HashCode吗?
如果你自己重写equals和hashcode方法是可以实现的,但是java规范要求两个equals的对象一定要有相同的hashcode

2.相同的字符串每次生成的HashCode都相同吗?
你的实现可以不同,但是java规范要求对于同一个对象每次生成的hashcode必须相同!

具体可参照API的Object中的equals方法和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;
    }
这个算发绝对不会算出两个结果的。      
回复 使用道具 举报
楼上正解。。{:soso_e113:}
回复 使用道具 举报
另外,版主对这个问题的评论很到位 {:soso_e113:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马