String字符串:
String字符串是由一個char數組構成的,由於這個數組是由final修飾的,所以String也叫做不可變字符串。
例如字符串:String s = ”1234”; 其實就是char[] value={‘1’,’2’,’3’,’4’};
String s=”123”; 和String s1=new String(“123”);,雖然申請的兩個字符串內容一樣,但是它們的內存地址是不一樣的,前者引用的是字符串池裏的字符串,後者是新建一個內存地址來存儲。所以比較的時候需要使用equals();方法來比較才能的出正確的結果。
例如:
運行結果:
什麼是字符串優化池?字符串池就是裏面養了一堆的字符串,所有這種方式申請的方式:String s=”123”; 都是指向的字符串池裏的字符串。
爲什麼會有個字符串優化池呢?因爲如果有一百個字符串內容是重複的,那麼假如沒有字符串池的話就會在內存中申請一百個內存地址來存儲。這樣的話就太耗費內存資源了,如果是一萬個十萬個字符串的話直接把內存給耗沒了。所以用字符串池解決了這個問題,String s=”123”;這種方式申請的字符串,所有重複的都是指向字符串池裏的同一個字符串,這樣即便有一萬個重複的字符串也只需要一個內存地址就可以儲存了。
String類有許多的構造器,這些構造器可以把byte數組、char數組等等轉換成字符串:
代碼示例:
運行結果
charAt方法:
按字符串下標拿出那個下標的字符方法。例如:
indexOf方法:
按字符串內容查找,查找到了就返回這個字符串內容第一個字符的下標,沒找到就返回-1
lastIndexOf方法:
按字符查找,找到就返回那個字符的下標
length方法:
此方法用於獲得字符串的長度
其餘方法如下圖:
由於String字符串是不可變字符串,在進行字符串追加或更改的時候,效率就會十分的慢。
做個小實驗就知道了:
運行結果:
添加100000個字符就需要耗去15.473秒的時間,可見效率之低。
既然有不可變字符串,那麼就有可變的字符串,那就是StringBuffer類,由於StringBuffer是可變字符串,所以適合追加,修改之類的操作,速度比起String是相當的快。
做個小實驗就知道了:
運行結果:
同樣的添加次數,StringBuffer只需要10毫秒就完成了,而String卻需要15.473秒也就是15473毫秒才能完成,所以StringBuffer創造出來就是用來解決這一問題的。
StringBuilder:
StringBuilder是和StringBuffer基本上一樣的,兩者都是繼承與AbstractStringBuilder,它們最大的區別在於前者的方法是沒有synchronized同步鎖的,而後者則有。所以在於數據的安全性上StringBuffer要安全些,裏面的數據不容易混亂。
從以下兩個類的部分代碼對比就可以到StringBuffer的方法都帶有synchronized關鍵字:
StringBuilder類的部分代碼:
StringBuffer類的部分代碼: