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
        有不明白的請留言。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章