黑马程序员技术交流社区

标题: 绕晕人的String类面试题 [打印本页]

作者: li3N    时间: 2015-11-11 20:59
标题: 绕晕人的String类面试题
以下程序运行后的结果是()
  1. public class Exec8 {
  2.         public static void main(String[] args) {
  3.                 String s1 = "a";
  4.                 String s2 = "b";
  5.                 String s3 = "ab";
  6.                 String s4 = "ab";
  7.                 System.out.println(s3 == s4); //结果为true,享元机制
  8.                 String s5 = "a" + "b";
  9.                 System.out.println(s3 == s5); //结果为true,常量优化机制
  10.                 String s6 = s1 + s2;
  11.                 System.out.println(s3 == s6); //结果为false,两个变量相加
  12.                 String s7 = new String("ab");
  13.                 System.out.println(s3 == s7); //结果为false,s7引用的实体在堆内存中
  14.                 final String s8 = "a";
  15.                 final String s9 = "b";
  16.                 String s10 = s8 + s9;
  17.                 System.out.println(s3 == s10); //结果为true,原理同s3 == s5,被final修饰的变量也是常量,同样享受常量优化机制
  18.         }
  19. }
复制代码

A、false true true false false
B、true false false true false
C、true true false false true
D、false false true false true
答案是D,原因写在注释上了,真的是看一次晕一次……
作者: 一个人走天下    时间: 2015-11-11 21:29
受教了,,多看几次就不晕了
作者: 唐彬    时间: 2015-11-12 00:05
总结得不错哦!
作者: gpalw    时间: 2015-11-12 11:00
看完了,没觉得晕呀,倒是学到新知识了
作者: 石三伢子1    时间: 2015-11-12 13:21
System.out.println(s3 == s6); //结果为false,两个变量相加
为什么会是false?
作者: 唯我独赞mo    时间: 2015-11-12 20:30
多看看String的内容就不会晕了
作者: 1379号监听员    时间: 2015-11-12 21:04
理解了就不晕咯
作者: young_ants    时间: 2015-11-12 21:33
领教了....记住咯
作者: 素锦流年    时间: 2015-11-12 21:37
记得了  谢谢提供
作者: dsap    时间: 2015-11-12 21:39
太绕了

作者: hbcoding    时间: 2015-11-12 22:01
感觉s3==s7那一个解释的不对啊,其他的引用实体就不在堆内存中吗?
作者: ljx550429    时间: 2015-11-12 22:22
晕的不行~~
作者: jia7604112    时间: 2015-11-12 22:24
感觉有点厉害顶一个
作者: nice非飞    时间: 2015-11-12 23:00
还好,要慢慢分析
作者: 深寒丶    时间: 2015-11-13 00:06
石三伢子1 发表于 2015-11-12 13:21
System.out.println(s3 == s6); //结果为false,两个变量相加
为什么会是false?

==判断的是地址值,s1+s2两个变量相加肯定是要先在堆内存开辟空间让它们进行运算,最终的结果是在堆内存中。而s3是常量,在常量池中,所以他么的地址值不相等
作者: 深寒丶    时间: 2015-11-13 00:09
hbcoding 发表于 2015-11-12 22:01
感觉s3==s7那一个解释的不对啊,其他的引用实体就不在堆内存中吗?

s3是常量,而s7是创建对象,所以必须在堆内存中开辟空间,一个在常量池,一个在堆内存,所以地址值是不相等的

作者: z13561291    时间: 2015-11-13 09:33
受教了,这个还真有不少知识点
作者: zypt0218    时间: 2015-11-13 10:24
晕菜了!!!
作者: yqlbd    时间: 2015-11-13 10:37
哈哈,这个不错,收藏了。
作者: hahaxiaohe    时间: 2015-11-13 11:20
谢谢分享,学习了.
作者: yubail    时间: 2015-11-13 19:39
谢谢分享
作者: 百变乔巴    时间: 2015-11-13 19:49
这是哪里的面试题




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