本帖最后由 杨佳名 于 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) 就显而易见了.
|