要想了解這兩種方式的區別,首先就得知道jvm底層有哪些區域,和String的創建原理
先借一張別人的圖片:
可以看到,jvm主要分棧區,堆區,方法區。我們只要先了解一下方法區
方法區中,存儲了每個類的信息(包括類的名稱、方法信息、字段信息)、靜態變量、常量以及編譯器編譯後的代碼等。
瞭解完方法區後,我們要了解編譯器創建String的過程。
String在創建對象時,會將字符串變成一個常量,如果是第一次創建會將這個常量存儲到方法區。如果方法區中已經存在,則直接將常量的地址交給String對象。
所以,當使用直接方法創建String對象是
String str = “string”;虛擬機會直接將常量的地址交給變量str
而使用new的方法創建時,我們知道new出來的對象會存放在堆中,所以
String s = new String(“string”);
s存的是在堆中的引用,堆中的引用存儲的是方法區String常量的地址。
可以根據一下代碼來證明:
package cn.geezer.string;
public class StringCreate {
public static void main(String[] args) {
/*
* 直接創建,所以兩個變量存儲的地址都是一樣的
* */
String str = "string";
String str1 = "string";
System.out.println(str == str1);
/*
*使用new的方式創建,兩個變量存儲的是堆中的引用地址,所以他們是不一樣的
*
*/
String s = new String("String");
String s1 = new String("String");
System.out.println(s == s1);
}
}
Files (x86)\Java\jre\lib\rt.jar;E:\Java\筆記\Recall\java-recall\out\production\java-recall" cn.geezer.string.StringCreate
true
false
進程已結束,退出代碼 0