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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Yaphets 中级黑马   /  2013-12-19 15:24  /  1196 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

                String str="abc";
                String str1=new String("abc");
                System.out.println("比较的是str和str1的地址:"+(str==str1));
                System.out.println("str的hashCode地址:"+str.hashCode());
                System.out.println("str1的hashCode地址:"+str1.hashCode());
str和str1的地址是不同的这我知道?但是为什么str和str1的hashCode却是相同的呢?

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

5 个回复

倒序浏览
equals()相等的两个对象,hashcode()一定相等;
equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。换句话说,equals()方法不相等的两个对象,hashcode()有可能相等

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
String str="abc";
String str1=new String("abc");
首先,可以确定这两个肯定不是同一个对象
System.out.println("比较的是str和str1的地址:"+(str==str1)); 比较的是地址值,这句话打印出来的结果是false已经验证了。str和str1的散列码是一样的,是因为在java.lang.String类中将Object类的hashCode()方法覆写了。
Object类中的hashCode()返回的是通过将该对象的内部地址转换成一个整数也就是哈希码,由于每个对象的内存地址都不一样,所以哈希码也不一样。但是在String类中覆写的hashCode()方法,String 对象的哈希码根据以下公式计算: s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1],
使用 int 算法,这里 s[i] 是字符串的第 i
个字符,n 是字符串的长度,^ 表示求幂。(空字符串的哈希值为 0。)
你的str,str1都是“abc”,由此算法计算的hashCode必然是一样的。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
字符串取得hashCode源码
  1. public int hashCode() {
  2.         int h = hash; //hash默认为o
  3.         if (h == 0 && value.length > 0) {
  4.             char val[] = value;

  5.             for (int i = 0; i < value.length; i++) {
  6.                 h = 31 * h + val[i];
  7.             }
  8.             hash = h;
  9.         }
  10.         return h;
  11.     }
复制代码

之所以你认为他们应该相同 是因为Object类的hashCode()是返回的是有存储地址经过hash算法得出的值  地址不同得出的值也不同,而String它的hash码是通过上面计算的,字符相同计算结果自然也相同,和存储地址无关

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
因为String类型的HashCode值的计算方式,是 通过字符计算的,所以相同
回复 使用道具 举报
哈希码为什么不同,因为那是两个对象在堆中比较内存地址,在这里,str和str1他们不是两个对象,一个在栈中生成str,一个在堆中生成str1,而此时你要比较的是str和str1的abc的哈希码,根据Object类中的hashCode()返回的是通过将该对象的内部地址转换成一个整数,所以既然两个都是abc,他们生成的哈希码也必然一样的。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马