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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 胡乃锋 于 2013-11-22 12:17 编辑
  1. String str01 = "123";
  2. String str02 = new String("123");
  3. System.out.println(str01.hashCode());//哈希值为48690
  4. System.out.println(str02.hashCode());//哈希值为48690
  5. System.out.println(str01 == str02);//false
复制代码
不懂为啥哈希值相同但“==”确是false?

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

3 个回复

倒序浏览
字符串的哈希值是通过字符串中的字符查表计算而出。相同的字符串哈希值是一样的。而==比较的是两个对象是否相同。
new String("123");它会产生两个对象。一个是 "123" 一个是"123"的副本。str01指向的是"123" , str02指向的是那个副本。还有字符串是一个常量,可以被共享。

下面是hashCode的计算方法。
String 对象的哈希码根据以下公式计算:
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
使用 int 算法,这里 s[i] 是字符串的第 i 个字符,n 是字符串的长度,^ 表示求幂。(空字符串的哈希值为 0。)

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
首先,==比较的是两个字符串的地址值,因为用代码String str02 = new String("123");是new了一个新对象,在内存中就新开辟了一个地址了,所以虽然都是"123",但是地址不同,所以为false。

其次,哈希值是根据字符串中的每个字符查编码表得到的数值在根据相印的算法得来的,比如每个字符对应的数字相加等等。因为两个字符串对象中的字符完全相同,所以算得的哈希值就相同了。
回复 使用道具 举报
hashCode()方法被String类的hashCode()方法覆盖,并非对象的真实内存地址,所以两个对象是不会相等的,只是他们的equals的值相等而已。
回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马