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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

wyxc

中级黑马

  • 黑马币:217

  • 帖子:130

  • 精华:0

© wyxc 中级黑马   /  2014-11-12 14:49  /  1986 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. String a = "abc";
  2. String b = "abc";
  3. String ab = "ab";
  4. String c = ab + "c";
  5. String d = "ab" + "c";
  6. System.out.println(a == b);
  7. System.out.println(a == c);
  8. System.out.println(a == d);
复制代码

结果是什么?为什么?

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

15 个回复

倒序浏览
应该是 TRUE  false  FALSE 第一个代表的是 同一个对象,同一个对象的地址值肯定一样的,第二个和第三个 都是相同的 他们表示运行之前是不同的对象相加得到的结果,是不一样的。
回复 使用道具 举报
加油 发表于 2014-11-12 15:13
应该是 TRUE  false  FALSE 第一个代表的是 同一个对象,同一个对象的地址值肯定一样的,第二个和第三个 都 ...

~~不好意思 我看错了 答案应该是 TRUE FALSE TRUE  第一个不用说 同一个对象,第二个不相同是因为ab是一个变量,他不是字符串呢,第三个都是字符串 也是相等的
回复 使用道具 举报
true false true
常量池的问题。
回复 使用道具 举报
变量字符串和字符串相连接不是字符串常量了,所以不是常量池了
回复 使用道具 举报
学习了,,,,,
回复 使用道具 举报
zhangyangLengen 发表于 2014-11-12 16:41
变量字符串和字符串相连接不是字符串常量了,所以不是常量池了

能不能讲的详细一点,特别是常量池的问题??求解,,,
回复 使用道具 举报
本帖最后由 杨佳名 于 2014-11-12 17:44 编辑

之前有个大神讲过类似的问题, 没有找到他的帖
其实就是纠结 (a == c); 和 (a == d);

先说d, 字符串赋值符号右边"ab"和"c"都是常量, 编译时就直接存储它们的字面值而不是它们的引用
也就是说, 在编译时就直接把它们连接的结果提取出来变成了"abc", 在class文件中就相当于String d = "abc"
然后虚拟机执行到这里, 就去常量池中找到了"abc", 所以 d 和 a 是指向了同一个字符串"abc", 所以 (a == d) 为真.

关于c, 字符串赋值符号右边是变量, 由于编译器的优化, 最终是通过StringBuilder调用append方法链接, 然后通过toString方法返回
即  String c = ab + "c";
等效于:
StringBuilder sb = new StringBuilder();
sb.append(ab);
sb.append("c");
String c = sb.toString();
(a == c) 就显而易见了.


回复 使用道具 举报 1 0
学习了!
回复 使用道具 举报
暴君 中级黑马 2014-11-12 19:41:28
10#
杨佳名 发表于 2014-11-12 17:40
之前有个大神讲过类似的问题, 没有找到他的帖
其实就是纠结 (a == c); 和 (a == d);

c和d的区别在哪里呢?变量ab赋值为"ab",c(“ab”+"c")跟d应该是一样的吧,都是String类型
回复 使用道具 举报
结果是true false true
8楼的是正确的,String不可以修改,而其存储到常量池
d在编译的时候就已经是“abc”
c在运行中重新生成一个字符串
回复 使用道具 举报
暴君 发表于 2014-11-12 19:41
c和d的区别在哪里呢?变量ab赋值为"ab",c(“ab”+"c")跟d应该是一样的吧,都是String类型 ...

c和d的对象就不一样
细分析一下--->
d = "ab" + "c";其实就是 d = "abc"; 即为一个对象
c = ab +"c";调用了StringBuilder构造器,这里就要看一下StringBulider
public StringBuilder() {
      super(16);
    }
接着看-->
AbstractStringBuilder(int capacity) {
        value = new char[capacity];
    }
就是说分配了一个长度16的char[]数组.
最后调用了toString方法,查看
public String toString() {
    // Create a copy, don't share the array
    return new String(value, 0, count);
  }
也就是说,c至少是产生了三个对象: 1 new StringBuilder;   2  new char[capacity] ; 3 new String(value, 0, count);

类似于 String s1 = "abc";String s2 = new "abc";
s1 == s1; //false

回复 使用道具 举报
wtjohn 中级黑马 2014-11-12 20:06:17
13#
杨佳名 发表于 2014-11-12 17:40
之前有个大神讲过类似的问题, 没有找到他的帖
其实就是纠结 (a == c); 和 (a == d);

多谢分析~ 结果能说个7788,但没法说这么清楚
回复 使用道具 举报
大神的认识就是深刻,这个问题终于搞懂了
回复 使用道具 举报
暴君 中级黑马 2014-11-13 14:02:24
15#
杨佳名 发表于 2014-11-12 19:58
c和d的对象就不一样
细分析一下--->
d = "ab" + "c";其实就是 d = "abc"; 即为一个对象

明白了,谢谢啦
回复 使用道具 举报
true false true
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马