java String類原理淺析

一.String類

    String 表示一個字符串,內部使用字符數組實現,該類不可變

二.存儲

上圖爲下列語句執行的內存存儲過程:
String S1 = “糞糞”;
String S2 = new String(“糞糞”);
String S3 = “糞糞”;

三.String實例(註釋很詳細):

public class StringDemo {
    public static void main(String[] args) {
        //String 的兩種賦值方式的分析,推薦第一種

        //1.直接賦值
        String S1 = "糞糞";
        //2.使用new關鍵字創建對象 new :表示在堆中申請內存空間,強制型的一個操作
        //面試題:下面語句創建了幾個對象?  --->1個
        String S2 = new String("糞糞");

        System.out.println(S1==S2);//比較指向的地址,返回false

        //String 類在運行期和編譯期的分析
        String S3 = "糞糞"; //常量池已有"糞糞",所以不會再創建對象,直接指向,省了內存空間
        System.out.println(S1==S3); //在常量池中找,所以會返回true
        System.out.println("-----------我是可愛的分割線---------");

        //4種情況分析:直接賦值,字符串連接時,分析編譯器和運行期
        //如果在編譯期值可以被確定,那就使用已有的對象,否則會創建新的對象
        String a = "a";//編譯時可以確定,所以直接把變量a替換成"a"
        String a1 = a+1;//編譯時語句是一句一句來的,會把a當成是變量,不可以確定,變量在運行的時候纔有值,上一句跑了,a纔有值,然後a1纔會爲"a1",
        //所以這句話會在堆中創建一個a1對象
        String a2 = "a1";//這句則在常量池中創建一個"a1",因此a1==a2 :false
        System.out.println(a1==a2);

        final String b="b";
        String b1=b+"1"; //編譯期b到這裏已替換,1加不加雙引號無所謂,final纔可以,沒有final就還是變量
        String b2 = "b1";
        System.out.println(b1==b2);//true

        String c = getC();  //注意,方法只有在運行期才能得到結果
        String c1 = c+1;
        String c2 = "c1";
        System.out.println(c1==c2);  //false

        final String d = getD();
        String d1 = d+1;
        String d2 = "d1";
        System.out.println(d1==d2);//還是false,因爲雖然d是final,但方法只有在運行時纔有返回結果,因此一樣是false
    }

    private static String getC(){
        return "c";
    }

    private static String getD(){
        return "d";
    }
}

輸出:
false
true
———–我是可愛的分割線———
false
true
false
false

發佈了35 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章