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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© bushangkoukou 中级黑马   /  2013-5-23 22:42  /  1900 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String s1="你好";
String s2="你";
String s3="好";

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

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

知道的大哥帮忙解释下,小弟万分感谢

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

8 个回复

倒序浏览
一个是判断内存地址的  一个是判断内容的  字符串比较是用的equals  不过面试嘛,本来就是不寻常的题目
回复 使用道具 举报
==比较的是内存地址值   而equals()比较的是字符串值   两者应用场景不同
回复 使用道具 举报
本帖最后由 棉/mg花/x糖 于 2013-5-23 23:24 编辑

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

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

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

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

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

希望能帮到你^_^

点评

正解  发表于 2013-5-24 00:34

评分

参与人数 2技术分 +2 收起 理由
袁梦希 + 1 排版不错,再给你1分
刘胜寒 + 1

查看全部评分

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

哥们每次答题都这么色彩斑斓
回复 使用道具 举报
神之梦 发表于 2013-5-23 23:32
哥们每次答题都这么色彩斑斓

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

不错  棉花糖  排版不错   我会关注你的  加油
回复 使用道具 举报
在Object中的equals方法是比较的是内存地址 等同于 ==。
在字符串中 equals方法被复写比较的是字符串内容是否相同。
在其他的类中,equals方法也会被重写赋予不同的内容。建议多查API表
而==是比较内存地址。

基于上面所说的:
s1 == s2+s3//这里得new一个新的String存储s2+s3,所以s1和新new的String是两个不同的地址。
s1==("你"+"好")//这里右边运算后自动在内存中查找是不是有相同的字符串,有的话就存在相同的地址上。所以左右地址相同。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马