下面的小程序用來判斷兩個字符串引用變量是否相等:
public class TestString {
public static void main(String[] args) {
String str1=new String("Hello Java!");
String str2=str1;
String str3="Hello Java!";
String str4="Hello Java!";
System.out.println(str1==str2);
System.out.println(str1==str3);
System.out.println(str3==str4);
}
}
輸出結果:
true
false
true
解析:
首先引用str1指向了一個內容為“Hello Java!”的字符串對象,然后把str1賦給str2,所以打印判斷str1==str2是true的因為他們存儲同一個地址值,接着隱含的創建了了字符串對象str3雖然st1與str3內容相同,但是他們是不同的對象,地址不同,所以打印str1= =str3結果是false。最后以同樣的方式創建了字符串str4為什么判斷str3==str4是true呢?由於字符串在程序中經常用到,Java為了加快程序的執行速度,把隱式創建的字符串對象放在棧中一個特殊區域—字符串池(String Pool)中,相同內容的字符串對象只保留一份,用引號新產生字符串對象時先從字符串池中尋找是否已經存在,若已經存在就取出來直接使用。而用new創建的字符串對象即使內容都是”Hello Java!”他們也是不同的對象實例,在內存中占不同的空間。