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類的兩種例項化的區別 前面已經指出,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採用非同步處理,屬於執行緒不安全操作。