黑马程序员技术交流社区

标题: 字符串问题 [打印本页]

作者: @ne_pie尒ce    时间: 2013-11-17 12:17
标题: 字符串问题
String s1= "a";
String s2= s1 + "b";
String s3= "a" + "b";
System.out.println(s2== "ab");
System.out.println(s3 == "ab");
为什么第一条打印为false,
第二条打印为true

作者: libra    时间: 2013-11-17 12:28
判断字符串是否相等不能用==.
作者: 唐宋元明清    时间: 2013-11-17 12:44
本帖最后由 唐宋元明清 于 2013-11-17 12:46 编辑

首先你要清楚。
s1指向的是常量池pool中的对象“a”
s2指向的是堆内存中新生成对象“ab”
s3指向的是常量池中的对象"ab"
==这个符合比较的是引用地址
对象 "ab"这个常量在常量池中永远只有一个。并且s3指向了它;
而堆内存中"ab"可以是无数个,就看引用地址了,相同的引用地址那么就相等,否则就是不同的对象,但内容都是"ab。
s2=="ab" //s2指向的是堆内存中的对象,而"ab"这个常量是在常量池中所以比较结果是false
s3=="ab" //s3指向的是常量池中的对象指向的就是常量池中的"ab",所以返回的就似乎true

总结一下就是,如果加号两边的是字面值(字面值就是直接在”"里写的值,比如上面的”a”与”b”),那么将在pool里查找有没对应内容的对象(这里的内容就是”ab”),并返回pool里的对象.
如果加号两边不满足上面的条件(比如,两边的值是引用值或者堆里的字符串对象).那么将不会再pool里查找”ab”,而是直接在堆里生成一个新的对象…

作者: 段光宇    时间: 2013-11-17 13:19
记住两点:
如果想比较两个字符串的地址是否相同,用“==”
如果想比较两个字符串的内容是否相同,用equal()方法
1.String s1= "a";这里s1在内存里开辟了一段空间赋值为a
String s3= "a" + "b";这里s3被赋值为ab,首先要在内存空间里寻找ab字段,如果没有,则新开辟一个地址进行存放,但内存里已经存在ab了,所以s3就指向s1的地址,s1==s3==“ab”比较的是地址,它们地址相同,所以返回true
2.s2的内容虽然也是ab,但其指向的地址并不与s1指向的“ab”相同,==号用来判断地址并不判断内容,所以s2==“ab”为fasle。







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