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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

19 个回复

倒序浏览
你确定是C是,你运行的结果是C吗,确定不是都false吗
回复 使用道具 举报
如果你的代码写的没错那就是C,很简单,第一个是一样的,第二个的S4+S5里面有空字符,S3没有,当然是false
回复 使用道具 举报
本帖最后由 RAo_w82Si 于 2016-5-29 10:08 编辑

String 类型的数据是存储在常量池中,s1 = “abc”先在常量池中创建 常量“abc”再将地址值赋给s1,当你通过有参构造创建s2时,系统在常量池找到“abc”,将地址值赋给S2,所以两个变量指向的是一个地址,所以S1 == S2 是true,而下面的 S1 S2 S3分别指向的是 不同的常量 因此地址值不同,所以S1==S2+S3是false ,如果他是S1 == “你好” + “吗”; 通过系统的常量优化机制 ,会在后台将两个字符串先拼接 在后搜索发现 常量池中已经有“你好吗”这个字符串,会将提升后的地址值与S1作比较结果为true, 这个和基本数据类型中 byte b = 1+2 不需要强制类型转换系统自动优化差不多
回复 使用道具 举报 1 0
觉得都是false啊
回复 使用道具 举报
android_vae 发表于 2016-5-29 09:47
如果你的代码写的没错那就是C,很简单,第一个是一样的,第二个的S4+S5里面有空字符,S3没有,当然是false ...

没有 空字符 编译器的问题
回复 使用道具 举报
本帖最后由 王子鹏 于 2016-5-29 11:33 编辑

答案是false false  原因: 字符串是不能用==来比较的  数值可以 字符串的比较方式是equals 如果==换成equals就是true true

4K3`@)N{CQEM0[QKXGT{]$O.png (169.28 KB, 下载次数: 29)

4K3`@)N{CQEM0[QKXGT{]$O.png
回复 使用道具 举报
王子鹏 发表于 2016-5-29 11:25
没有 空字符 编译器的问题

嗯嗯,是,==比较的是对象是否是同一个
回复 使用道具 举报
RAo_w82Si 发表于 2016-5-29 10:00
String 类型的数据是存储在常量池中,s1 = “abc”先在常量池中创建 常量“abc”再将地址值赋给s1,当你通 ...

同学。两个都是false哦,不过你提出的地址值的概念让我学到了
回复 使用道具 举报
本帖最后由 li6232876 于 2016-5-31 13:04 编辑
  1. 39.        下面程序的运行结果是  (D  )
  2.    String s1 = “abc”;
  3.    String s2 = new String(“abc”);
  4.    System.out.println(s1==s2);
  5.    String s3 = “你好吗”;
  6.    String s4 =”你”;
  7.    String s5 =”好吗”;
  8.    System.out.println(s3==(s4+s5))  
  9. d)      false  false   
复制代码

同学,这道题的答案是D。我给你简单分析一下:第一个:
(1)String s1 = “abc”;  这是在常量池创建了一个对象,常量池中的地址一指向了s1;
(2)String s2 = new String(“abc”);  这个其实创建了两个对象,一个在常量池,一个在堆内存;而s2储存的却是堆内存中的地址值;
所以,s1==s2为 false。
第二个:
字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的。再通过 toString 方法实;

所以,s3==(s4+s5)为false。
第三:请大家看如下代码:
  1. String s1 = "a" + "b" + "c";
  2. String s2 = "abc";
  3. System.out.println(s1 == s2);
复制代码
这个结果为true,这个才是正确的“java常量优化机制”表现形式。



明白的点个支持吧,纯手打,不谢!哈哈~~
回复 使用道具 举报 4 0
黑猫的消失 发表于 2016-5-30 19:21
同学。两个都是false哦,不过你提出的地址值的概念让我学到了

我看错了 S2=new String();的时候new在内存中创建了新对象,所以S2有新的地址值,如果是S2 = "abc",那么S1== S2就是成立的,
回复 使用道具 举报
引用数据类型用 == 比较的是地址值 这题选择D
回复 使用道具 举报
都是flase,都是比较的地址值
回复 使用道具 举报
li6232876 发表于 2016-5-30 20:00
同学,这道题的答案是D。我给你简单分析一下:第一个:
(1)String s1 = “abc”;  这是在常量池创建了一 ...

第二个是堆内存吧???
回复 使用道具 举报
都是false!!!s1和s2的地址值不一样!!s2创建了两个对象!!一个是常量池中的一个在堆内存中!!s1就是常量池的,,s2是在堆内存中 ,所以地址值不一样!!
回复 使用道具 举报
不太懂C
回复 使用道具 举报
恩  选D,对象用==比较的是地址值
回复 使用道具 举报
答案是D吧.同学
回复 使用道具 举报
这个选d吧  你好好看看
回复 使用道具 举报
li6232876 发表于 2016-5-30 20:00
同学,这道题的答案是D。我给你简单分析一下:第一个:
(1)String s1 = “abc”;  这是在常量池创建了一 ...

明白了,分析得非常详细明白,满分, 赞赞赞!!!!!!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马