1. 程式人生 > >Java中創建String的兩種方式差異

Java中創建String的兩種方式差異

ima 分享 引用 永遠 bubuko 技術分享 方式 println print

我們知道創建一個String類型的變量一般有以下兩種方法:

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

那麽為什麽會存在這兩種創建方式呢,它們在內存中的表現形式各有什麽區別?

方法1:

String a = "abcd";
String b = "abcd";

System.out.println(a == b);      // true
System.out.println(a.equals(b)); // true

解析:
用""創建的a,b兩個字符串,==和equals比較返回都為true,這是因為a,b都指向了方法區的同一個字符串。所以,當同樣的一個字符串用""重復創建時只在方法區創建一次。

方法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創建的c,d兩個字符串,equals為true很簡單因為equals永遠比較的是值,而==為false說明兩個字符串的引用不一樣。用new創建的字符串每次都會在JVM堆中創建,所以c,d都對應堆中的兩個不同的字符串。
關於這兩道題中的""和new創建的字符串在內存中的表現形式可以看下圖就明白了。

技術分享圖片

Java中創建String的兩種方式差異