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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 学霸你在哪里呀 中级黑马   /  2015-3-26 19:37  /  1594 人查看  /  16 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String s3 = “你好吗”;
  String s4 =”你”;
  String s5 =”好吗”;
  System.out.println(s3==(s4+s5))   为什么输出是false?

评分

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

查看全部评分

16 个回复

倒序浏览
“你”“好吗” 前面不要加空格  空格是一个字符的 去掉就是true了
回复 使用道具 举报
原生类型比较用==,对象比较使用equals
回复 使用道具 举报
String是引用类型,s3和(s4+s5)它们指向的引用不同,所以不相等
回复 使用道具 举报
好像是有空格吧
回复 使用道具 举报
s4+s5是变量操作,执行后,会在开辟一个变量存储,这个时候的地址就不是s3的了,所以是false
回复 使用道具 举报
引用类型用==是比较地址是否相等。应该用equals方法的
回复 使用道具 举报
感觉 中级黑马 2015-3-26 22:31:03
8#
本帖最后由 感觉 于 2015-3-26 22:35 编辑

==在比较基本数据类型时,是比较的值是否相同
==在比较引用数据类型时,是比较对象的内存地址值
String s3 = “你好吗”;   //在字符串常量池中 比如地址值是0x1122
  String s4 =”你”;
  String s5 =”好吗”;
”你”+”好吗”//它也指向了0x1122
在内存中和“你好吗”其实就是一个对象“你好吗”==”你”+”好吗”   true

s3==(s4+s5)                //因为是变量相加,所以是在内存中新开辟了空间,就是不同的对象了  false
回复 使用道具 举报
Grady 中级黑马 2015-3-26 22:52:45
9#
String是引用类型,现在==比较的引用地址。所以是false,你用equals就对了
回复 使用道具 举报
感觉 发表于 2015-3-26 22:31
==在比较基本数据类型时,是比较的值是否相同
==在比较引用数据类型时,是比较对象的内存地址值
String s3  ...

为什么变量相加就会令另外辟空间呢
回复 使用道具 举报
温大帅 发表于 2015-3-26 22:54
为什么变量相加就会令另外辟空间呢

变量是不确定的,不能像”你”+”好吗”那样直接拼接后指向”你好吗”的内存地址,
变量相加需要开辟空间后再进行操作。
回复 使用道具 举报
a1301155262 来自手机 中级黑马 2015-3-26 23:42:35
12#
引用型变量使用equals
回复 使用道具 举报
原生类型比较用==,对象比较使用equals
回复 使用道具 举报
我来说说吧:
String s1 = "你好吗";
String s2 = "你";
String s3 = "好吗";
System.out.println(s1 == (s2 + s3));
JVM对字符串在连接时的处理是,当两个字符串在拼接时是没有变量存在:例如:
String s4 = "aaa"+"bbb";
这样s4在编译时就能确定了,也就是s4的值就是aaabbb。所以s4 == "aaabbb"返回的ture
但是如果字符串的拼接存在变量,例如:
String s5 = "aaa";
String s6 = "bbb"+s5;
这样s6在编译时期就不能确定值,所以s6=="bbbaaaa"是返回false的

总结:只要字符串在拼接后在编译时期就能确定他的值,那么就可以进行==返回的值就是true了。
若是想让结果为true。可以在前面加上fianl,进行宏替换
String s1 = "你好吗";
final String s2 = "你";
final String s3 = "好吗";
System.out.println(s1 == (s2 + s3));
回复 使用道具 举报
lwj123 发表于 2015-3-27 11:39
我来说说吧:
String s1 = "你好吗";
String s2 = "你";

明白了!!!:D:lol谢谢版主讲解

点评

不谢不谢  发表于 2015-3-27 19:25
回复 使用道具 举报
你的S5有空格啊。加起来跟S3当然不匹配啦·多个空的字符
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马