天天看點

領會String類誕生的奧妙 | 帶你學《Java面向對象程式設計》之二十八

上一篇:旋轉跳躍-學會操作String類資料 | 帶你學《Java面向對象程式設計》之二十七

【本節目标】

通過閱讀本節内容,你将深刻了解String類兩種執行個體化方式的異同,并能夠熟練使用兩種方式完成String類的執行個體化,充分運用系統記憶體。

String類兩種執行個體化方式差別

現在已經清楚了在String類對象執行個體化的過程之中一共提供有兩種處理模式,那麼現在就需要區分好到底該使用哪種會更好。

  1. 分析直接指派的對象執行個體化模式

在程式之中隻需要将一個字元串指派給String類的對象就可以實作對象的執行個體化處理,現在假設隻有如下一行代碼:

public class StringDemo{
       public static void main(String args[]) {
              String str="mldn”;
       } 
}           

這種情況下肯定隻會開辟出一塊堆記憶體空間,此時的記憶體關系圖如下:

領會String類誕生的奧妙 | 帶你學《Java面向對象程式設計》之二十八

圖一 記憶體關系圖

除了這種記憶體模式之外,利用直接指派執行個體化String的形式還可以實作同一個字元串對象資料的共享操作。

範例:觀察String直接指派時的資料共享

public class StringDemo{
       public static void main(String args[]) {
              String strA="mldn”;
              String strB="mldn”;
               System.out.println(strA == strB) ;      //位址判斷  
       } 
}           

此時程式的判斷結果傳回了“true”,那麼可以得出結論,這兩個對象所指向的堆記憶體是同一個,也就是說這個時候的記憶體關系如圖所示:

領會String類誕生的奧妙 | 帶你學《Java面向對象程式設計》之二十八

圖二 記憶體分析關系圖二

之是以現在會有這樣的特點,主要的原因是在Java程式的底層裡面提供有一個專門的字元串池(字元串數組)。

範例:分析字元串池

public class StringDemo{
       public static void main(String args[]) {
              String strA="mldn”;
              String strB="mldnjava”;
               String strC = "mldn" ;
               System.out.println(strA == strB) ;      //位址判斷  
       } 
}           
領會String類誕生的奧妙 | 帶你學《Java面向對象程式設計》之二十八

圖三 記憶體分析關系圖三

在采用直接指派的處理過程之中,對于字元串而言可以實作池資料的自動儲存,這樣如果再有相同資料定義時,可以減少對象的産生,以提升操作性能。

  1. 構造方法執行個體化

構造方法進行對象執行個體化可以說是在進行對象定義的時候的一種常見做法,String類為了滿足于設計的結構要求也提供有構造方法執行個體化的做法。

public class StringDemo{
       public static void main(String args[]) {
              String str =new String ("mldn”);
       } 
}           

那麼此時對于本程式而言,我們可以通過記憶體關系圖進行觀察。

領會String類誕生的奧妙 | 帶你學《Java面向對象程式設計》之二十八

圖四 記憶體分析結果四

此時會開辟兩塊堆記憶體空間,而後隻會使用一塊,而另外一塊由于字元串常量所定義的匿名對象将成為垃圾空間。

範例:更換一種形式

public class StringDemo{
       public static void main(String args[]) {
              String strA="mldn”;
              String strB=new String("mldn”);
       } 
}           
領會String類誕生的奧妙 | 帶你學《Java面向對象程式設計》之二十八

圖五 記憶體分析結果圖五

除了以上的特點之外,在使用構造方法執行個體化String對象時不會自動出現儲存到字元串池的處理。

範例:觀察構造方法執行個體化對象時的池操作

public class StringDemo{
       public static void main(String args[]) {
              String strA="mldn”;
              String strB=new String("mldn”);
              System.out.println(strA == strB) ;
        }   //false
}           

可以發現構造方法執行個體化的對象實際上是屬于一種自己專用的記憶體空間,但是在String類裡面也提供有幫助開發者實作手工入池的處理情況,這個方法:public String intern();

範例:觀察手工入池

public class StringDemo{
       public static void main(String args[]) {
              String strA="mldn”;
              String strB=new String("mldn”).intern();
              System.out.println(strA == strB) ;
        }   //true
}           

在使用構造方法定義對象之後由于使用了intern()方法,是以即便是構造出來的String類對象的内容也可以實作對象池的統一管理,但是這種做法太繁瑣。

面試題:請解釋String類兩種對象執行個體化方式的差別?

  • 直接指派:隻會産生一個執行個體化對象,并且可以自動儲存到對象池之中,以實作該字元串執行個體的重用。
  • 構造方法:會産生兩個執行個體化對象,并且不會自動入池,無法實作對象重用,但是可以利用intern()方法手工入池處理。

想學習更多的Java的課程嗎?從小白到大神,從入門到精通,更多精彩不容錯過!免費為您提供更多的學習資源。

本内容視訊來源于

阿裡雲大學 下一篇:教你從記憶體了解字元串修改奧秘 | 帶你學《Java面向對象程式設計》之二十九 更多Java面向對象程式設計文章檢視此處