1. 程式人生 > >String s=new String("xyz");建立幾個String物件的問題

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));

       輸出 false,true