黑马程序员技术交流社区
标题:
关于String的一些问题
[打印本页]
作者:
Yaphets
时间:
2013-12-19 15:24
标题:
关于String的一些问题
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却是相同的呢?
作者:
wyf880204
时间:
2013-12-19 15:34
equals()相等的两个对象,hashcode()一定相等;
equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。换句话说,equals()方法不相等的两个对象,hashcode()有可能相等
作者:
恨死我了
时间:
2013-12-19 15:46
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必然是一样的。
作者:
四五六七八
时间:
2013-12-19 15:47
字符串取得hashCode源码
public int hashCode() {
int h = hash; //hash默认为o
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
复制代码
之所以你认为他们应该相同 是因为Object类的hashCode()是返回的是有存储地址经过hash算法得出的值 地址不同得出的值也不同,而String它的hash码是通过上面计算的,字符相同计算结果自然也相同,和存储地址无关
作者:
┾——黑马
时间:
2013-12-19 16:20
因为String类型的HashCode值的计算方式,是 通过字符计算的,所以相同
作者:
黄伟财
时间:
2013-12-20 11:48
哈希码为什么不同,因为那是两个对象在堆中比较内存地址,在这里,str和str1他们不是两个对象,一个在栈中生成str,一个在堆中生成str1,而此时你要比较的是str和str1的abc的哈希码,根据Object类中的hashCode()返回的是通过将该对象的内部地址转换成一个整数,所以既然两个都是abc,他们生成的哈希码也必然一样的。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2