String字符串直接創建與new的方式比較

要想了解這兩種方式的區別,首先就得知道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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章