在jvm中存在着String Pool
String对象是不变对象,在程序运行过程中可能用到多个具有相同值得String对象,jvm中使用String pool来优化这种情况。当有新的String对象要建立的时候,jvm先检查Pool中时候已经有具有相同值的String对象,如果有就把这个对象的引用传递给新建立的对象,如果没有,就新建立一个对象,并将它放到Pool中。
String对象的建立有两种方式:
String s = "abc";
or
String s = new String("abc");
在String Pool中这两种方式建立的对象有所不同,实际上String Pool只是对无名称String对象有效,即:通过方式一建立的具有相同值的对象也具有相同的内存地址。而对于通过new来建立的对象并不起作用,即用这样方式建立的对象具有自己的内存空间。
class hello{
public static void main(String args[]){
String s1 = "abc";
String s2 = "abc";
System.out.println("s1==s2? "+(s1==s2));
System.out.println("s1.equal(s2)? "+s1.equals(s2));
String s3 = new String("abc");
String s4 = new String("abc");
System.out.println("s3==s4? "+(s3==s4));
System.out.println("s3.equal(s4)? "+s3.equals(s4));
System.out.println("s1==s3? "+(s1==s3));
System.out.println("s1.equal(s3)? "+s1.equals(s3));
}
}
结果:
s1==s2? true //-- ps: s1和s2具有相同的内存地址。
s1.equal(s2)? true
s3==s4? false //-- ps: s3和s4具有不同内存地址。
s3.equal(s4)? true
s1==s3? false
s1.equal(s3)? true
下面的代码会输出什么呢? :)
class hello{
public static void main(String args[]){
String s5 = new String("abc");
String s6 = "abc";
System.out.println("s5==s6? "+(s5==s6));
System.out.println("s5.equal(s6)? "+s5.equals(s6));
}
}
结果:
s5==s6? false
s5.equal(s6)? true
预料之中!
/////////////////////////////////////////////下面为引用////////////////////////////////////////////////////////
FROM:http://www.matrix.org.cn/thread.shtml?forum_id=19&view_id=17459
以上这句说话并没有错.那是在说String 放在String pool时的特例.
for example:
String a = "abc"; // 检查String pool有没有这组字串,发现没有就create一个
String b = "abc"; // 检查String pool有没有这组字串,发现有,就直接引用它的reference
if(a==b) 是true;
但当用到new时就会有如下的情形.
String a = new String("abc");
// 检查String pool有没有这组字串,发现没有就create一个,
// 因为用new,所以同时亦建立一个新的instance给它.
String b = new String("abc");
// 检查String pool有没有这组字串,发现有,就直接引用它的reference
// 因为用new,所以同时亦建立另一个新的instance给它.
知道为甚麽new String("abc")亦要检查String pool吗.
那是因为String()的constructor是原因.
这是其中一个String的constructor : String(String original).
留意当new String("abc")时.
其实已经先做了一个动作,String original = "abc".