1. 程式人生 > >淺析Java中的String

淺析Java中的String

一、String類

 1.概述

   String類代筆的是字串,是引用資料型別,Java中的所有字串文字都可以被看成是這個類的實現

   字串表面上看起來儲存的是一個字元陣列,但是其底層實際上儲存的是字元陣列對應的位元組陣列。

  2.常用構造方法

 1 //初始化一個新建立的 String 物件,使其表示一個空字元序列。
 2         public String();
 3         String string1 = new String();
 4         string1 = "abc";
 5 
 6 // 分配一個新的 String,使其表示字元陣列引數中當前包含的字元序列。 
7 public String(char[] chars); 8 char[] ch = {'a','b','c'}; 9 String string2 = new String(ch); 10 11 //通過使用平臺的預設字符集解碼指定的 byte 陣列,構造一個新的 String。 12 public String( byte[] value); 13 byte[] b = {97, 98, 99}; 14 String string3 = new String(b); 15
16 //直接建立 17 String string4 = "abc";

   下面咱們來說一說這四種建立方式,

   前三種建立方式是引用型別常見的建立方式,都是先在棧中定義一個String型別的變數,然後在堆中new一塊空間出來,把這塊空間的地址賦給棧中的變數

   但是String類既然是引用資料型別,那為什麼可以不用new就可以直接建立呢?

   在聊這個之前就不得不說一下Java虛擬機器(jvm)的底層劃分了,

   Java虛擬機器分為五個部分,分別是棧,堆、方法區、,用一張圖片說明一下,沒啥美術天分,畫的比較醜

   接著上個問題,為什麼string可以像基本資料型別那樣直接賦值?

  在jvm的堆記憶體中有一塊東西叫做字串常量池,在賦值的時候把裡面的一個地址賦給了string ,常量池中的的這個地址又指向的是堆中的一個位元組陣列,根據ASCII碼錶可知其實這樣就相當於儲存了對應的字元

  3.字串值的比較

 1    String str1 = "abc";
 2  
 3   String str2 = "abc";
 4 
 5   String str3 = "a";
 6 
 7   String str4 = "bc";
 8 
 9   char[] ch = {'a','b','c'};
10 
11   String str5 = new String(ch);

 

  上面的程式碼中,來做個比較,(引用型別比較值是通過重寫Object型別的equals方法實現的,String類重寫過這份方法)

  str1 == str2結果竟然是神奇的true,大家都知道字串是引用型別,引用型別是不能直接進行比較的,直接比較結果相等意味著二者的地址值相等,這也就是說他們兩個儲存的是同一個地址,為什麼呢?這就是前面說過的字串常量池的原因了,如果給字串直接賦值,它預設是呼叫字串常量池裡的內容的所以二者的地址其實都是指向了字串常量池中的。

  str1 == "a" + "bc";結果也是true,其實咱們的JVM是很智慧的,在編譯的時候虛擬機器給我們的程式碼做了優化,其實就和第一種情況是一樣的

  str1 == str3 + "bc"; 這時候結果就出現變化了,因為整個出現了變數,在編譯的時候虛擬機器遇到變數就不會幫你把表示式轉換成第一種情況了。

  str1 == str4 這個結果其實大家已經可以想到了,結果是false,因為二者的地址是完全不一樣的。

  語言表達能力實在有限,放一張圖把,圖片來源黑馬的培訓視訊。

 

  

  

 寫文章的目的是為了讓自己以後查詢起來更加便捷一點,可能會右很多錯誤,以後慢慢再來更正。