黑马程序员技术交流社区
标题:
求大牛解决字符串常量问题
[打印本页]
作者:
boboyuwu
时间:
2016-2-9 22:28
标题:
求大牛解决字符串常量问题
class StringDemo_01
{
public static void main(String []args) {
String str1="wu";
String str2="bo";
String str3=str1+str2;
String str4="wubo";
System.out.println(str3);
//为什么str3==str4 值是false??
//提出问题: 打印str3的hashCode 值等于3660715 然后打印str4的hashCode 值也等于
//660715,那么高潮来了,这个str3 的值是一个地址 ,str4的值也是一个地址,2个变量的地址
//值相等为什么==结果是false 求大牛解答.
}
}
作者:
hexinchun
时间:
2016-2-11 22:53
因为两者比较的是具体的对象吧,地址值相等的原因是当对内存中已经存在了同样的对象时,就不会再重新创建新的对象,只是把地址值引用了
作者:
洋葱头头
时间:
2016-2-12 08:58
一个变量str3 内存分配地址 一个变量str4 内存也分配地址
==比较的是地址 难道还能是true??
而且str3 和str4 指向的都是字符池里的wubo 所以hashcode值一样
作者:
zmhlnrs
时间:
2016-2-12 12:02
本帖最后由 zmhlnrs 于 2016-2-12 12:03 编辑
内存中是有堆栈的 str3 和str4 的内存地址不一样
内存中还有一片区域叫字符创常量池 他们的值是保存在字符串常量池里,新建一个变量后会在堆栈中给出对应的地址值,==比较的是地址值,所以==为false,而给他们赋值的时候就会去字符串常量池里面去找,如果有就不创建,如果没有就新创建出这个值放在里面,如果你用的equals那么他们的值为true。
作者:
tujiu888
时间:
2016-2-12 15:34
== 比较的是地址值,二者的地址值是不一样的
作者:
苗超维
时间:
2016-2-13 00:12
两个不同的变量 地址值不同
作者:
j6819236
时间:
2016-2-17 20:40
为什么hashCode值相等而两个字符串变量不相等,其实并不能简单地把hashCode值看做变量地址,因为你查看底层代码可以发现,String类重写了hashCode方法.而返回的值确只与String的内容有关。
public int hashCode() {
//hash默认初始化为0
int h = hash;
//value可以看做String.toCharArray拆成的字符数组
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;
}
复制代码
假设 String s1="abc";
String s2="ab";
String s3="c";
String s4=s2+s3;
h=(97*31+98)*31+99
你会发现s1.hashCode()会与s4hashCode()相等都为96354,但是s1并不等于s4,因为他们内存地址不等
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2