黑马程序员技术交流社区

标题: 为什么这两种方式哈希值相同,但是使用"=="确实false? [打印本页]

作者: 胡乃锋    时间: 2013-11-22 02:21
标题: 为什么这两种方式哈希值相同,但是使用"=="确实false?
本帖最后由 胡乃锋 于 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?


作者: 汪洋大海    时间: 2013-11-22 03:29
字符串的哈希值是通过字符串中的字符查表计算而出。相同的字符串哈希值是一样的。而==比较的是两个对象是否相同。
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。)
作者: 够了没有    时间: 2013-11-22 11:14
首先,==比较的是两个字符串的地址值,因为用代码String str02 = new String("123");是new了一个新对象,在内存中就新开辟了一个地址了,所以虽然都是"123",但是地址不同,所以为false。

其次,哈希值是根据字符串中的每个字符查编码表得到的数值在根据相印的算法得来的,比如每个字符对应的数字相加等等。因为两个字符串对象中的字符完全相同,所以算得的哈希值就相同了。
作者: freehiker    时间: 2013-11-22 11:56
hashCode()方法被String类的hashCode()方法覆盖,并非对象的真实内存地址,所以两个对象是不会相等的,只是他们的equals的值相等而已。




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