1. 程式人生 > >JavaSE三個特殊類---String類

JavaSE三個特殊類---String類

String類

  • String類的兩種例項化方式 a.直接賦值 (推薦使用此方式) String str = “Hello world”; b.通過構造方法例項化String類物件 String str = new String(“Hello world”);

  • 字串的比較 public boolean equals(String str); 在這裡插入圖片描述

Q請比較String中“==”與“equals( )”的區別。 A:“==”:本身是進行數值比較的,如果用於物件比較,那麼所比較的就應該是兩個物件所儲存的記憶體地址數值的比較,而沒有比較物件的內容。 “equals( )”:可以進行字串內容的比較。

  • 字串常量是String類的匿名物件 在任何語言的底層,都不會提供有直接的字串型別。現在所謂的字串只是高階語言使用者方便開發的支援而已。在java中,本身也沒有直接提供字串常量的概念,所有使用“”定義的內容本質上來講都是String的匿名物件

那麼之前出現的“String str = “Hello world””,本質上就是講一個匿名的String類物件設定有名字,而且匿名物件一定儲存在堆記憶體中。 tips:在進行制定內容比較時,將指定內容(字串常量)寫在前面,避免NullPointerException。 方式1: 在這裡插入圖片描述 以上面程式碼為例,如果使用者沒有輸入時,一定會出現 NullPointException

問題。 方式2:任何字串常量都是String類的匿名物件,所以該物件永遠不會為null。 在這裡插入圖片描述

在此強烈建議方式2,把字串寫在前面。

  • String類的兩種例項化的區別 前面已經指出,String類有直接賦值和通過構造方法兩種方式來例項化物件,那麼使用哪一種更好以及彼此之間的區別有哪些呢?

a.直接賦值 在這裡插入圖片描述 前面已經說過,“==”比較的是兩個物件所儲存的記憶體地址的數值,但此處為什麼會又會返回true呢。如下圖:

在這裡插入圖片描述 為什麼現在並沒有開闢新的堆記憶體空間呢? 因為String類的設計使用了共享設計模式

在JVM底層實際上會自動維護一個物件池(字串物件池),如果現在才有了直接賦值的模式進行String類的物件例項化操作,那麼該例項化物件(字串內容)將自動儲存到這個物件池之中。如果下次繼續使用直接賦值的模式宣告String類物件,此時物件池之中如若有指定內容,將其進行引用;如若沒有,則開闢新的字串物件而後將其儲存在物件池之中以供下次使用。

所謂的物件池就是一個物件陣列(目的就是減少開銷)

b.採用構造方法例項化物件 類物件使用構造方法例項化是標準做法。 在這裡插入圖片描述

在這裡插入圖片描述

可知,如果使用String構造方法就會開闢兩塊堆記憶體空間,並且其中一塊堆記憶體將成為垃圾空間。除了這一缺點之外,也會對字串共享產生問題。

範例:觀察字串共享問題 在這裡插入圖片描述

在String類中提供有方法入池操作: public String intern( );

範例:觀察入池操作 在這裡插入圖片描述 在這裡插入圖片描述 此時,因為例項化str1時使用了intern()使其儲存進了物件池中,所以str2 例項化時直接在物件池中查詢。

總結如下: 1.直接賦值:只會開闢一塊堆記憶體空間,並且該字串物件可以自動儲存在物件池中以供下次使用。 2.構造方法:會開闢兩塊堆記憶體空間,其中一塊成為垃圾空間,不會自動儲存在物件池中,可以使用intern()方法手工入池。 因此,一般我們會採用第一種方式即直接賦值。

- 字串常量不可變更 所有的語言對於字串的底層實現,都是字元陣列,陣列的最大缺陷就是長度固定。在定義字串常量時,它的內容不可改變。

在這裡插入圖片描述 以上字串的變更時字串物件的變更而非字串常量

在這裡插入圖片描述 可以發現字串上沒有發生任何變化,但是字串物件的引用一直在改變,而且會形成大量的垃圾空間。正是因為String的特點,如果有很多使用者都使用了同樣的操作,那麼產生的垃圾數量就相當可觀了。

原則: 1.字串使用就採用直接賦值。 2.字串比較就使用equals()實現。 3.字串別改變太多。

- 字元與字串 字串就是一個字元陣列,所以在String類裡面支援有字元陣列轉換為字串以及字串變為字元的操作方法。 在這裡插入圖片描述 其中,字串和字元陣列的互相轉換是重點。 在這裡插入圖片描述 範例:判斷一個字串是否由數字組成。 在這裡插入圖片描述

- 位元組與字串 位元組常用於資料傳輸以及編碼轉換的處理之中,在String中提供有隊位元組的支援。 在這裡插入圖片描述 應該注意的是,位元組並不適合處理中文。按照程式的概念來講,一個字元等於兩個位元組。位元組只適合處理二進位制資料。

- 字串比較 之前使用過String類提供的equals()方法,該方法本身是可以進行區分大小寫的相等判斷。除了這個方法之外,String類還提供有如下的比較操作: 在這裡插入圖片描述

在String類中compareTo()方法是一個非常重要的方法,該方法返回一個整形,該資料會根據大小關係返回三類內容:

     1.相等:返回0
     2.小於:返回內容小於0
     3.大於:返回內容大於0

程式碼如下: 在這裡插入圖片描述

- 字串查詢 從一個完整的字串之中可以判斷指定內容是否存在,對於查詢方法有如下定義: 在這裡插入圖片描述 其中,字串的查詢,最好用最方便的就是contains( )。而很多時候一些引數利用標記做一些處理,這時就利用startsWith()與endsWith( )來判斷

  • 字串替換 使用一個指定的新的字串替換掉已有的字串資料,可用的方法如下: 在這裡插入圖片描述 - 字串拆分 可以將一個完整的字串按照指定的分隔符劃分為若干個子字串。可用方法如下: 在這裡插入圖片描述 範例:實現字串的拆分處理 在這裡插入圖片描述 範例:拆分IP地址 在這裡插入圖片描述 應該注意的是,有些內容無法拆分開就需要使用“\”轉義。

範例:多次拆分 在這裡插入圖片描述

- 字串擷取 從一個完整的字串之中擷取處部分內容。可用方法如下: 在這裡插入圖片描述 在這裡插入圖片描述 注意:索引下標從0開始。

- 字串的其他操作方法 在這裡插入圖片描述 範例:首字母大寫 在這裡插入圖片描述

兩隻SB(StringBuffer 和 StringBuilder)

為了方便字串的修改,提供StringBuffer類。在String中使用“+”來進行字串連線,但是這個操作在StringBuffer類中需要更改為append()方法: public synchronized StringBuffer append(各種資料型別 b);

String和StringBuffer最大的區別在於:String的內容無法修改,而StringBuffer的內容可以修改。頻繁修改字串的情況考慮使用StringBuffer。

注意:String和StringBuffer類不能直接轉換。如果要想互相轉換,可以採用如下原則: 1.String變為StringBuffer:利用StringBuffer的構造方法或append()方法。 2.StringBuffer變為String:呼叫toString()方法;

除了append()方法外,StringBuffer也有一些String類沒有的方法: 1.字串反轉 public synchronized StringBuffer reverse( ); 在這裡插入圖片描述 2.刪除指定範圍的資料 public synchronized StringBuffer delete(int start , int end);

在這裡插入圖片描述 3.插入資料 public synchronized StringBuffer insert(int offset, 各種資料型別 b);

在這裡插入圖片描述

Q:請解釋String , StringBuffer,StringBuilder的區別: A: 1.String的內容不可修改,StringBuffer與StringBuilder的內容可以修改。 2.StringBuffer採用同步處理,屬於宣城安全操作;而StringBuilder採用非同步處理,屬於執行緒不安全操作。