黑马程序员技术交流社区

标题: 关于==字符串比较的,String不是在常量池里面么? [打印本页]

作者: shi980088    时间: 2014-5-25 23:46
标题: 关于==字符串比较的,String不是在常量池里面么?
String s3 = “abc”;
String s4 =”a”;
String s5 =”bc”;
System.out.println(s3==(s4+s5))
为什么返回结果是false?求解释。不是在常量池里面么?

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


作者: Boonie_Bears-Te    时间: 2014-5-26 00:31
我是这么理解的 常量池中 假设S3的地址为A S4和S5的地址为BC 所以S3!=(S4+S5)
作者: shi980088    时间: 2014-5-26 00:34
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呢
作者: shi980088    时间: 2014-5-26 00:37
Boonie_Bears-Te 发表于 2014-5-26 00:31
我是这么理解的 常量池中 假设S3的地址为A S4和S5的地址为BC 所以S3!=(S4+S5)

这个好像有点懂了,嘿嘿,谢啦,突然茅塞顿开
作者: Boonie_Bears-Te    时间: 2014-5-26 00:39
shi980088 发表于 2014-5-26 00:37
这个好像有点懂了,嘿嘿,谢啦,突然茅塞顿开

还有 最好去看一下 == 和 引用类型String 中的方法equals的不同点 比如2楼所说的那样
作者: hamiguadjs    时间: 2014-5-26 00:53
本帖最后由 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, 下载次数: 459


作者: ender    时间: 2014-5-26 00:56
感觉有点没说清楚   直接上内存运算图吧

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

a b!=abc.jpg

作者: hamiguadjs    时间: 2014-5-26 08:37
shi980088 发表于 2014-5-26 00:34
还是不懂,String s3 = “abc”;
String s4 =”abc”;
System.out.println(s3==s4)

这个问题,我已经帮你回答了啊
作者: 茂子    时间: 2014-5-26 08:47
数组很特殊呐,顺便学习学习,加深巩固。。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2