天天看點

String s=new String("xyz");建立幾個String對象的問題

首先讓我們了解幾個概念:

棧 :由JVM配置設定區域,用于儲存線程執行的動作和資料引用。

堆 :由JVM配置設定的,用于存儲對象等資料的區域。

常量池constant pool :在堆中配置設定出來的一塊存儲區域,用于存儲顯式 的String,float或者integer.這是一個特殊的共享區域,可以在記憶體中共享的不經常改變的東西,都可以放在這裡。

進入正題:

String a = "abc";①

String b = "abc";②

使用String a = "abc";的方式,可以在一定程度上提高程式的運作速度,因為JVM會自動根據棧中資料的實際情況來決定是否有必要建立新對象。

①代碼執行後在Constant Pool中建立了一個值為abc的String對象,②執行時,因為Constant Pool中存在"abc"是以就不在建立新的String對象了。

String   c   =   new   String("xyz");①

String   d   =   new   String("xyz");②

讓我們來看看這兩句代碼在記憶體中發生了什麼,①Class被CLassLoader加載時,你的"xyz"被作為常量讀入,在constant  

pool裡建立了一個共享的"xyz",然後當調用到new   String("xyz")的時候,會在heap裡建立這個new  

String("xyz");②由于constant   pool中存在"xyz"是以不再建立"xyz",然後建立新的new  

String("xyz")。

對于String c = new String("xyz");的代碼,與String a = "abc"不同的是一概在堆中建立新對象,不管其字元串值是否相等,是否有必要建立新對象,進而加重了程式的負擔。

程式1

String   s1   =   new   String("xyz");     //建立二個對象,一個引用

String   s2   =   new   String("xyz");     //建立一個對象,并且以後每執行一次建立一個對象,一個引用

程式2

String   s3   =   "xyz";     //建立一個對象,一個引用  

String   s4   =   "xyz";     //不建立對象,隻是建立一個新的引用

重要的是了解constant pool與new關鍵字

當調用 intern 方法時,如果池已經包含一個等于此 String 對象的字元串(該對象由 equals(Object)

方法确定),則傳回池中的字元串。否則,将此 String 對象添加到池中,并且傳回此 String 對象的引用。(無論怎樣都傳回池中的對象)

下面的這個例子能幫助我們更深入的了解String的存儲和指派原理

String str1 = new String("123");

        String str2 = "123";

        String str3 = str1.intern();

        System.out.println((str1 == str2) +","+ (str3 == str2));

        輸出 false,true

        String str4 = new String("234");

        String str5 = new String("234");

        String str6 = str4.intern();

        String str7 = str5.intern();

        System.out.println((str4 == str5) +","+ (str6 == str7));

        有不明白的請留言。