Java字元常量詳解

來源:互聯網
上載者:User

標籤:char   類型   定義   short   str   記憶體   地方   字串   log   

  在Java程式中經常會遇到類似於"Hello"這樣地字串,那麼這種類型的字串是Java中是如何儲存,下面就來討論一下字串常量在記憶體中的儲存方式

 

  Java程式在編譯時間會將程式中出現的常量(包括:char、byte、short、int、long、boolean和String類型)放到一個叫做常量池的地方。常量池也稱為對象池,顧名思義  常量池中儲存的是對象。

  那麼在來源程式中檢測到"Hello"這樣地常量字串之後,編譯器都幹了些什麼:

  首先,在常量池中建立一個String對象,該對象的記憶體分布如:

  

  這裡就需要提一下String定義的兩個變數:

  private final char value[];    //The value is used for character storage

  private int hash;  //Cache the hash code for the string

  其中第一個就是實際儲存字串的數組,所有字串最終的儲存形式都是字元數組。從中可以很清晰的看出,實際的字元數組還是儲存在堆中,常量池中儲存的是String對象。

  當執行String str = "Hello",只是將常量池中"Hello"對象的地址賦給了str。

 

  除了上面這個字串常量的記憶體模型需要理清之外,String類還有幾個很常用的建構函式,也需要對記憶體模型非常熟悉:

  1. public String() {

    this.value = "".value;

  }

  這是預設的建構函式,它將一個空串的字元數組引用賦給了本類的數組數組引用,所以這個String對象中什麼也沒有當然這樣做並沒有什麼好處,因為String對象一但建立便不可更改其內容(從value的修飾關鍵字final可以看出)。

  2.  public String(String original) {

    this.value = original.value;

    this.hash = original.value;

  }

   這裡只是簡單的複製了引用的值,並沒有複製引用的內容,它們仍然指向同一個對象。

  3. public String(char value[]) {

    this.value = Arrays.copyOf(value, value.length);

  }。

  Array.copyOf()會將value中的值重新拷貝一份出來,所以this.value和參數中的value完全是兩個對象,只不過它們的值相同而已

  其餘的建構函式也基本類似,大家可自行分析

Java字元常量詳解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.