黑马程序员技术交流社区

标题: 一道面试题,不是很明白,求解释 [打印本页]

作者: bushangkoukou    时间: 2013-5-23 22:42
标题: 一道面试题,不是很明白,求解释
String s1="你好";
String s2="你";
String s3="好";

System.out.println(s1==s2+s3);
这个为false
System.out.println(s1==("你"+""好));
这个为true

我的疑惑是这里为什么不是用equal  而是用“==”

知道的大哥帮忙解释下,小弟万分感谢
作者: kimi    时间: 2013-5-23 22:53
一个是判断内存地址的  一个是判断内容的  字符串比较是用的equals  不过面试嘛,本来就是不寻常的题目
作者: yanzhigang    时间: 2013-5-23 23:13
==比较的是内存地址值   而equals()比较的是字符串值   两者应用场景不同
作者: 棉/mg花/x糖    时间: 2013-5-23 23:19
本帖最后由 棉/mg花/x糖 于 2013-5-23 23:24 编辑

楼主,别苦恼,我来帮你解释。
其实,这很容易理解,s1、s2、s3引用的均是在编译时就加载进内存的字符串常量
也就是说:"你好"、"你"、"好"的地址在编译时就唯一确定了。
因此,s1、s2、s3的地址的完全不一样。自然 s1 == s2+s3的值为false了。

为什么 "你好" == "你"+"好" 的值为ture呢
这是因为字符串常量拼接是值的拼接拼接好后它得存储(临时空间)啊,他会先去查找在本程序所占内存空间中有没有"你好"这个存储块如果有,就直接将引用地址指向它,即和字符串对象s1共用一段存储区间否则,得另外开辟空间(临时空间)存这个新字符串常量

这是由于Java关于引用对象的多余内存空间回收机制所致

最后是“==”运算,对于引用对象,“==”是对地址值得判定,结果显然为true。

注意:字符串常量也是引用类型数据,他是匿名的引用对象

希望能帮到你^_^


作者: 神之梦    时间: 2013-5-23 23:32
棉/mg花/x糖 发表于 2013-5-23 23:19
楼主,别苦恼,我来帮你解释。
其实,这很容易理解,s1、s2、s3引用的均是在编译时就加载进内存的字符串常 ...

哥们每次答题都这么色彩斑斓

作者: 棉/mg花/x糖    时间: 2013-5-23 23:42
神之梦 发表于 2013-5-23 23:32
哥们每次答题都这么色彩斑斓

想突出重点,结果发现........^_^你懂的
作者: 袁梦希    时间: 2013-5-24 01:09
棉/mg花/x糖 发表于 2013-5-23 23:19
楼主,别苦恼,我来帮你解释。
其实,这很容易理解,s1、s2、s3引用的均是在编译时就加载进内存的字符串常 ...

不错  棉花糖  排版不错   我会关注你的  加油
作者: 王靖远    时间: 2013-5-24 18:01
在Object中的equals方法是比较的是内存地址 等同于 ==。
在字符串中 equals方法被复写比较的是字符串内容是否相同。
在其他的类中,equals方法也会被重写赋予不同的内容。建议多查API表
而==是比较内存地址。

基于上面所说的:
s1 == s2+s3//这里得new一个新的String存储s2+s3,所以s1和新new的String是两个不同的地址。
s1==("你"+"好")//这里右边运算后自动在内存中查找是不是有相同的字符串,有的话就存在相同的地址上。所以左右地址相同。




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