在Java中用引號建立String物件和用建構函式的區別
阿新 • • 發佈:2018-12-17
建立一個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” 的引用直接返回了。