黑马程序员技术交流社区
标题:
java 字符串,hashCode 问题
[打印本页]
作者:
hzhzhen
时间:
2015-5-18 14:44
标题:
java 字符串,hashCode 问题
public class Test {
public static void main(String[] args) {
String a="abc";
String b=new String("abc");
System.out.println(a==b);
System.out.println(a.hashCode()==b.hashCode());
}
}
复制代码
输出:
false
true
a和b不是在内存中有两个字符串,他们的物理地址不一样吧?
第二个输出true的原因是什么?
hashCode 返回值是根据字符串内容么?
作者:
pvbj0314
时间:
2015-5-18 16:02
首先来看String类中对应的构造函数。
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
复制代码
编译时在常量池中有字符串"abc",它是String类型的,语句
String a="abc";
将字符串"abc"的地址值赋值给a。
语句 String b=new String("abc");调用的就是上述构造函数,因此,b的成员变量,value和hash与字符串"abc"是相同的,但是因为new操作,在内存中分配了新的空间,具有新的地址值。
另外,
public int hashCode() {
int h = hash;
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;
}
复制代码
综上,可以得出程序的输出结果了。
作者:
xgd6612
时间:
2015-5-18 16:04
第一个是 false 因为 String b=new String("abc"); new了一下 在内存在新开辟了位置 所以地址值不同,
第二个是ture 因为 a b 都是代表 字符串 “abc” 他们在哈希表中的位置是相同的 所以 ture。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2