1. 程式人生 > >在Java中用引號建立String物件和用建構函式的區別

在Java中用引號建立String物件和用建構函式的區別

建立一個String物件一般有以下兩種方式:

String str1 = "abcd";  
String str2 = new String("abcd");  

這兩種方式有什麼區別呢?我們可以通過下面兩個小例子來說明.

Example 1:

String a = "abcd";  
String b = "abcd";  
System.out.println(a == b);  // True  
System.out.println(a.equals(b)); // True  

這裡 a == b 為 true,是因為 a 和 b 都引用了方法區的同一個字串字面值。在java中,當同一個字串字面值出現多次時,在記憶體中只會儲存該字串的一份拷貝,即 a 指向的 “abcd” 跟 b 指向的 “abcd” 在記憶體中是同一個物件。這種方法叫做 “字串駐留(string interning)”。

Example 2:

String c = new String("abcd");  
String d = new String("abcd");  
System.out.println(c == d);  // False  
System.out.println(c.equals(d)); // True  

我們知道,new運算子的作用是在堆記憶體中建立一個新的物件。因而這裡兩次 new 就會在堆中建立兩個String物件,儘管它們的字面值是相同的,但其實是兩個同不的物件,佔兩份空間。因此 c == d 自然會返回 false 了。圖示如下:

此外,我們可以呼叫String的intern()方法來強制讓JVM使用字串駐留,例如下面的程式碼:

String c = new String("abcd").intern();  
String d = new String("abcd").intern();  
System.out.println(c == d);  // Now true  
System.out.println(c.equals(d)); // True  

intern()方法呼叫時,首先會在字串常量池中檢查有沒有 “abcd”.equals(常量池中的字串)為true的物件,如果有,則把該物件返回,如果沒有,則建立一個”abcd”物件放到常量池中。因此,在建立d 的時候,intern()就會把先前建立的 “abcd” 的引用直接返回了。