java String 緩衝池概念的舉例說明

來源:互聯網
上載者:User

口試中常會碰到String物件建構的題目。例如String s= new String("a");建立了幾個對象。

下面根據代碼具體解釋一下各種String構造情況。

代碼如下:

public class TestConstructString {      public static void main(String args[])      {          String s1 = "a";          String s2 = "b";          String s3 = "ab";                    String s4 = "ab";          System.out.println("s3==s4? "+ (s3==s4));            String s5 = "a"+"b";          System.out.println("s3==s5? "+ (s3==s5));                    String s6 = s1+s2;          System.out.println("s3==s6? "+ (s3==s6));                    String s7 = new String("ab");          System.out.println("s3==s7? "+ (s3==s7));                    final String s8 = "a" ;           final String s9 = "b" ;          String s10 = s8 + s9;          System.out.println("s3==s10? "+ (s3==s10));          }  } 


輸出結果為:

s3==s4? trues3==s5? trues3==s6? falses3==s7? falses3==s10? true


在解釋之前先對String做個簡單的先容。

百度百科:java中的字串。 String類是不可變的,對String類的任何改變,都是返回一個新的String類對象。 String 對象是 System.Char 對象的有序集合,用於表示字串。String 對象的值是該有序集合的內容,並且該值是不可變的。

特別留意:String類是不可變(final)的,對String類的任何改變,都是返回一個新的String類對象.這樣的話把String類的引用傳遞給一個方法,該方法對String的任何改變,對原引用指向的對象沒有任何影響,這一點和基礎資料型別 (Elementary Data Type)相似.

String池:String是不可改變的,為了進步效率Java引用了字串池的概念,例如new String("abc");首先會在String池中建立一個對象“abc”由於有NEW的 存在所以會分配地址空間copyString池的內容。當出現的String對象在String池中不存在時即在String池中建立該對象。

s3與s4根據String的概念他們都指向了同一個緩衝池內的地址,所以結果為true

s3與s5由於相加的兩個為常量所以編譯器會把s5="a"+"b"最佳化為s5="ab"。所以結果也為true。

s3與s6由於是兩個變數的相加所以編譯器無法最佳化,s1+s2即等同於(new StringBuilder(String.valueOf(s1))).append(s2).toString(); 在運行時,會有新的String地址空間的分配,而不是指向緩衝池中的“ab”。所以結果false。

s3與s7,根據緩衝池的定義在new的時候實際會新分配地址空間,s7指向的是新分配的地址空間所以與緩衝池地址不同,所以為false

s3與s10,類似於s3與s5,由於是final類型編譯器進行了最佳化所以相同。

建立字串的方式很多,回納起來有三類:

其一,使用new關鍵字建立字串,比如String s1 = new String("abc");

其二,直接指定。比如String s2 = "abc";

其三,使用串聯天生新的字串。比如String s3 = "ab" + "c"; 

String對象的建立 

String對象的建立也很講究,關鍵是要明白其原理。

原理1:當使用任何方式來建立一個字串對象s時,Java運行時(運行中JVM)會拿著這個X在String池中找是否存在內容相同的字串對象,假如不存在,則在池中建立一個字串s,否則,不在池中添加。
  
原理2:Java中,只要使用new關鍵字來建立對象,則一定會(在堆區或棧區)建立一個新的對象。
  
原理3:使用直接指定或者使用純字串串聯來建立String對象,則僅僅會檢查維護String池中的字串,池中沒有就在池中建立一個,有則罷了!但盡不會在堆棧區再往建立該String對象。
  
原理4:使用包含變數的運算式來建立String對象,則不僅會檢查維護String池,而且還會在堆棧區建立一個String對象。
  
另外,String的intern()方法是一個本地方法,定義為public native String intern(); intern()方法的價值在於讓開發人員能將留意力集中到String池上。當調用 intern 方法時,假如池已經包含一個即是此 String 對象的字串(該對象由 equals(Object) 方法確定),則返回池中的字串。否則,將此 String 對象添加到池中,並且返回此
String 對象的引用。 

    最後,有幾點題目請大家留意:String a; 與String a=null在作為類變數時候是等價的,在局部變數則不同。null表示一個Null 參考,String a=null意思是在棧中聲明了a,但是這個a沒有指向任何地址。此時我們留意到String a 在棧中聲明了a,但是也沒有指向任何地址,但是java的語法檢查假如在局部變數中,String a;是不能直接使用的,String a=null中的這個a可以直接使用。

總之:

//情況一String s1 = "s"; // 建立了一個對象;//情況二s1 = new String("s"); //建立了兩個對象//情況三String s2 = new String("a" + s1); //建立了三個對象
點此查看原文

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.