请教一个String类问题 String a = “张三”;String b =“张”;String c =“三”;String d = b+c;为什么a==d啊,内存中是什么样的 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 a==d得到的结果应该是false的,因为在JVM中,a所指向的内存区域和d所指向的内存区域是不同的,但是如果使用的是a.equals(d)得到的结果是true,此时由于String类中的equals方法进行了覆盖,所以只要两个对象内容一致,返回true。但是a==d得到的结果却只有false,不会为true。你可以自己写几行代码尝试着做做,很快就能明白的! 没new的话 abc不是应该在常量池吗 那个里面不是唯一的吗 我初学感觉这个把我弄迷糊了 String类用==比较的是地址,不是实际值。比如你a的地址是2001; b的地址是2002;//瞎写的,下同 c的地址是2003;那么你b+c的地址是2004。//因为String类已确定的值不会改变。你把地址为4的值引用到d上。那么a==d对比的是地址2001和地址2004,而不是分别的两个值(“张三”和“张三”)。这两个地址当然不同,所以为false。要想比较两个String类的值是否相等,就必须用.equals(ogj)方法。 就必须用.equals(obj)方法。写错了。我没有权限编辑。 看来楼主被绕晕了。想要弄清楚这个问题,得先弄清楚以下概念:1、常量池: 字符串常量池(String pool, String intern pool, String保留池) 是Java堆内存中一个特殊的存储区域, 当创建一个String对象时,假如此字符串值已经存在于常量池中,则不会创建一个新的对象,而是引用已经存在的对象。2、==与equals的区别:==比较的是内存地址。再来看楼主的问题:String d = b+c 为什么不等于a,楼主你看String源码就知道了。b+c,先执行StringBuilder的拼接,相当于new了一下,虽然值相等,但内存地址已变。所以d==a肯定为false,我以前也被绕晕过,哈哈,有什么不懂得可以继续问我。 http://blog.csdn.net/u010887744/article/details/50844525楼主有兴趣可以看看这篇文章:《Java的string类常量池及不可变性》,希望对你有所帮助。 不扯什么常量池的概念,就说内存,内存里有四个对象:1,“张三”2,“张”3,“三”4,“张三”注意第一个张三和最后一个不是同个对象,就是不在同个内存地址里面,另外==用来比较内存地址。所以他们不等于的理由就是:1,==比较的是内存地址,所以结果就取决于内存地址是否相同2,内存地址不一样的,所以结果false [求助]用java实现简单工厂模式下的计算器程序时出现的问题,求大侠指教! 请教 将mysql数据库里的blob数据用java画出来 急急急!!! 急 Java登录博客系统并发表博文 在java中,已经知道三边如何求角度啊 System.in.read(buffer)输入字符计数 在JF中怎么才可以控制icon的对象的移动? 新手初学java,关于汉字显示问题,高手赐教(小妹谢谢各位大侠)! 如何判断鼠标左右键被按下的先后顺序?? ★★★门外汉想了解下JAVA 请教一个sound有关的问题? 请高手来看看这段代码有什么问题? 小白请教问题(二)
比如你a的地址是2001;
b的地址是2002;//瞎写的,下同
c的地址是2003;
那么你b+c的地址是2004。//因为String类已确定的值不会改变。
你把地址为4的值引用到d上。那么a==d对比的是地址2001和地址2004,而不是分别的两个值(“张三”和“张三”)。
这两个地址当然不同,所以为false。要想比较两个String类的值是否相等,就必须用.equals(ogj)方法。
我没有权限编辑。
1、常量池: 字符串常量池(String pool, String intern pool, String保留池) 是Java堆内存中一个特殊的存储区域, 当创建一个String对象时,假如此字符串值已经存在于常量池中,则不会创建一个新的对象,而是引用已经存在的对象。
2、==与equals的区别:==比较的是内存地址。
再来看楼主的问题:
String d = b+c 为什么不等于a,楼主你看String源码就知道了。b+c,先执行StringBuilder的拼接,相当于new了一下,虽然值相等,但内存地址已变。
所以d==a肯定为false,我以前也被绕晕过,哈哈,有什么不懂得可以继续问我。
1,“张三”
2,“张”
3,“三”
4,“张三”
注意第一个张三和最后一个不是同个对象,就是不在同个内存地址里面,另外==用来比较内存地址。
所以他们不等于的理由就是:
1,==比较的是内存地址,所以结果就取决于内存地址是否相同
2,内存地址不一样的,所以结果false