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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

String s3 = “abc”;
String s4 =”a”;
String s5 =”bc”;
System.out.println(s3==(s4+s5))
为什么返回结果是false?求解释。不是在常量池里面么?

11 个回复

倒序浏览
String 是一个特殊的包装类数据,他有两种两种声明方式,第一种是String s=“a“;第二种是String s= new String(”a“);不能把他看成基本数据类型;故这里==表示不是值相等,而是表示是否指向同一对象;如果要比较类里面的值是否相等,可以使用equals()方法,(equals方法对于类File、String、Date及包装类来说,比较的是值而不是内存地址)

评分

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

查看全部评分

回复 使用道具 举报
我是这么理解的 常量池中 假设S3的地址为A S4和S5的地址为BC 所以S3!=(S4+S5)
回复 使用道具 举报
ender 发表于 2014-5-26 00:29
String 是一个特殊的包装类数据,他有两种两种声明方式,第一种是String s=“a“;第二种是String s= new S ...

还是不懂,String s3 = “abc”;
String s4 =”abc”;
System.out.println(s3==s4)
这个结果是ture,为什么呢,而
String s3 = “abc”;
String s4 =”a”;
String s5 =”bc”;
System.out.println(s3==(s4+s5))结果是false呢
回复 使用道具 举报
Boonie_Bears-Te 发表于 2014-5-26 00:31
我是这么理解的 常量池中 假设S3的地址为A S4和S5的地址为BC 所以S3!=(S4+S5)

这个好像有点懂了,嘿嘿,谢啦,突然茅塞顿开

点评

请问一下 你所理解的常量池是指?  发表于 2014-5-26 07:52
画了一个图 竟然跑到最下面了  发表于 2014-5-26 07:51
回复 使用道具 举报
shi980088 发表于 2014-5-26 00:37
这个好像有点懂了,嘿嘿,谢啦,突然茅塞顿开

还有 最好去看一下 == 和 引用类型String 中的方法equals的不同点 比如2楼所说的那样
回复 使用道具 举报
本帖最后由 hamiguadjs 于 2014-5-26 08:35 编辑

       对于输出打印的“s4+s5”,其中s4和s5都是变量,它们在常量池中会重新创建对象,所以和s3的地址值比较不同,但是如果是System.out.println(s3==("a"+"bc"));则输出的结果就是true,因为“a”、“bc”都是常量,在常量池 中,如果存在“abc”,就不会重新创建,直接使用已经构建好的值了。下面使用图例说明(附在压缩文件中)

常量池中的字符串.rar

10.34 KB, 下载次数: 451

回复 使用道具 举报
ender 中级黑马 2014-5-26 00:56:47
8#
感觉有点没说清楚   直接上内存运算图吧

a b!=abc.jpg (101.15 KB, 下载次数: 82)

a b!=abc.jpg
回复 使用道具 举报
shi980088 发表于 2014-5-26 00:34
还是不懂,String s3 = “abc”;
String s4 =”abc”;
System.out.println(s3==s4)

这个问题,我已经帮你回答了啊
回复 使用道具 举报
数组很特殊呐,顺便学习学习,加深巩固。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马