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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 河边捉虾米 中级黑马   /  2016-9-17 22:02  /  1936 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

39.        下面程序的运行结果是(  D   )
   String s1 = “abc”;
   String s2 = new String(“abc”);
   System.out.println(s1==s2); //flase
   String s3 = “你好吗”;
   String s4 =”你”;
   String s5 =”好吗”;
   System.out.println(s3==(s4+s5)) // flase
a)        true true
b)        false true
c)        true flase
d)        false false


请问大神,为什么System.out.println(s3==(s4+s5));为什么这个是false

12 个回复

正序浏览
河边捉虾米 发表于 2016-9-18 12:12
s4+s5是在堆中开辟两个空间么?

开辟一个空间,用来存储s4和s5拼接后的值
回复 使用道具 举报
字符串是对象  地址值 记得  就好比较了
回复 使用道具 举报
Fate_stay 发表于 2016-9-17 22:05
s5前面有个空格,s4前面也有一个空格,这都算一个字节,所以s3 不等于 s4 + s5

你在逗我么,
回复 使用道具 举报
18001105207 发表于 2016-9-17 22:22
这个问题是这样的,因为s4 和s5 是变量,在进行编译的时候不会进行拼接,在执行的时候会先开辟一个新的空间 ...

s4+s5是在堆中开辟两个空间么?
回复 使用道具 举报
Fate_stay 发表于 2016-9-17 22:05
s5前面有个空格,s4前面也有一个空格,这都算一个字节,所以s3 不等于 s4 + s5

哈哈哈,比确定不是猴子请来的都比吗
回复 使用道具 举报
==比较的是地址值,s3的字符串“你好吗”先进入常量池中,把地址值赋给s3,s4+s5进行字符串拼接会开辟新的空间,所以地址值不一样
回复 使用道具 举报
我也学到了
回复 使用道具 举报
我也学到了
回复 使用道具 举报
如果你这是 System.out.println(s3==("你"+"好吗")) 那结果就是true 因为这在生成class时已经拼接完成,那他会自动去常量池里先找.如果是变量,那是等编译时再进行拼接,所以结果会不同.

点评

讲的不错  发表于 2016-9-18 12:10
回复 使用道具 举报
这个问题是这样的,因为s4 和s5 是变量,在进行编译的时候不会进行拼接,在执行的时候会先开辟一个新的空间,在进行拼接。而==比较的是地址值,所以新开辟的空间地址值,和s3的地址值是不等的。
回复 使用道具 举报
本帖最后由 Fate_stay 于 2016-9-19 00:18 编辑

很晚看到的,,没考虑太多就回了.话说这个问题都问烂了.  是因为s2是新创建的对象, == 号比较的是地址值,所以 s1 == s2为 false. s4 和 s5都是变量,系统在运行前,不知道它们的具体值,所以也开辟了空间, 因此s3 == (s4+s5)为false.(诚心回答了问题,不管对不对,身份都是真实信息,不要随便黑人好吗)   String s1 = “abc”;
   String s2 = new String(“abc”);
   System.out.println(s1==s2); //flase
   String s3 = “你好吗”;
   String s4 =”你”;
   String s5 =”好吗”;
   System.out.println(s3==(s4+s5)) // flase
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马