Java String类的问题

Java_Coder 发布于 2014/07/18 15:33
阅读 271
收藏 0

String a = "a";
String b = "b";
String c = "a"+b;
String d = "a"+"b";
String e ="ab";
System.out.println(c==e); //false
System.out.println(d==e); //true
        

我想说的是:为什么c和e不相等呢。。

加载中
0
爪哇小贩
爪哇小贩
==比较栈值,不是堆值,应该用equals比较
Java_Coder
Java_Coder
String c ="a"+ "b"; c这个引用是放在哪里的呢? 放在栈中? String d ="a"+ b; 这个d是放在哪里的呢?
0
老樊

==不仅比较大小,还比较对象的引用,你试试c.equals(e)返回结果就是true

Java_Coder
Java_Coder
其实我不明白的是c,d是放在内存中的那个部分。。。。
0
泥瓦匠BYSocket
泥瓦匠BYSocket
http://www.cnblogs.com/Alandre/p/3826439.html

关于String我写过一篇文章 看懂就好了

泥瓦匠BYSocket
泥瓦匠BYSocket
漫漫看
Java_Coder
Java_Coder
高端!!!全英文。。
0
E-leven11
E-leven11
 "a"+"b"和 "ab"  java虚拟机编译后同样都是"ab"
0
pseudo
pseudo

引用来自“E-leven11”的评论

 "a"+"b"和 "ab"  java虚拟机编译后同样都是"ab"

而如果操作符间有变量的话,这个字符串操作会使用StringBuilder进行优化。所以"a"+b编译后就等于:

StringBuilder sb = new StrinbBuilder("a");

sb.append(b);

String c=sb.toString();

而通过StringBuild会产生一个新的字符串对象,不管常量池中有没有与这个字符串内容相同的字符串。

0
Cobbage
Cobbage

*a='ab';

*b='ab'

a==b?true:false;

0
purely
purely
常量的话,编译器会做优化。d和e都是可以预料的值:"ab",所以编译器优化后,d,e引用同一个"ab"常量。(或者说是字面量)。c是引用了常量“a”+一个String的引用b。这个b是不可预知的,所以c的引用在运行时才确定。所以d==e, c!=e.
返回顶部
顶部