黑马程序员技术交流社区

标题: 为什么下面这道题是C答案?求解 [打印本页]

作者: 来了都是heima    时间: 2016-5-28 23:59
标题: 为什么下面这道题是C答案?求解
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

作者: 我love    时间: 2016-5-29 00:25
你确定是C是,你运行的结果是C吗,确定不是都false吗
作者: android_vae    时间: 2016-5-29 09:47
如果你的代码写的没错那就是C,很简单,第一个是一样的,第二个的S4+S5里面有空字符,S3没有,当然是false
作者: RAo_w82Si    时间: 2016-5-29 10:00
本帖最后由 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 不需要强制类型转换系统自动优化差不多
作者: 逝水大魔王    时间: 2016-5-29 11:24
觉得都是false啊
作者: 王子鹏    时间: 2016-5-29 11:25
android_vae 发表于 2016-5-29 09:47
如果你的代码写的没错那就是C,很简单,第一个是一样的,第二个的S4+S5里面有空字符,S3没有,当然是false ...

没有 空字符 编译器的问题
作者: 王子鹏    时间: 2016-5-29 11:29
本帖最后由 王子鹏 于 2016-5-29 11:33 编辑

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

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

4K3`@)N{CQEM0[QKXGT{]$O.png

作者: android_vae    时间: 2016-5-30 10:36
王子鹏 发表于 2016-5-29 11:25
没有 空字符 编译器的问题

嗯嗯,是,==比较的是对象是否是同一个
作者: 黑猫的消失    时间: 2016-5-30 19:21
RAo_w82Si 发表于 2016-5-29 10:00
String 类型的数据是存储在常量池中,s1 = “abc”先在常量池中创建 常量“abc”再将地址值赋给s1,当你通 ...

同学。两个都是false哦,不过你提出的地址值的概念让我学到了
作者: li6232876    时间: 2016-5-30 20:00
本帖最后由 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常量优化机制”表现形式。



明白的点个支持吧,纯手打,不谢!哈哈~~

作者: RAo_w82Si    时间: 2016-5-30 20:35
黑猫的消失 发表于 2016-5-30 19:21
同学。两个都是false哦,不过你提出的地址值的概念让我学到了

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

第二个是堆内存吧???
作者: wujiankai    时间: 2016-5-30 21:51
都是false!!!s1和s2的地址值不一样!!s2创建了两个对象!!一个是常量池中的一个在堆内存中!!s1就是常量池的,,s2是在堆内存中 ,所以地址值不一样!!
作者: 学渣一枚    时间: 2016-5-30 22:05
不太懂C
作者: 782083354    时间: 2016-5-30 22:10
恩  选D,对象用==比较的是地址值
作者: kongdun1991    时间: 2016-5-30 22:37
答案是D吧.同学
作者: kunwenli    时间: 2016-5-30 22:43
这个选d吧  你好好看看
作者: 来了都是heima    时间: 2016-5-30 23:51
li6232876 发表于 2016-5-30 20:00
同学,这道题的答案是D。我给你简单分析一下:第一个:
(1)String s1 = “abc”;  这是在常量池创建了一 ...

明白了,分析得非常详细明白,满分, 赞赞赞!!!!!!!




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