- Java程序員面試筆試寶典(第2版)
- 何昊等編著
- 961字
- 2022-06-17 16:00:50
1.18 String、StringBuffer、StringBuilder和StringTokenizer的區別
在Java語言中,有四個類可以對字符或字符串進行操作,分別是String、StringBuffer、StringBuilder和StringTokenizer,其中Character用于單個字符操作,String用于字符串操作,屬于不可變類,而StringBuffer也是用于字符串操作,不同之處是StringBuffer屬于可變類。
String是不可變類,也就是說String對象一旦被創建,其值將不能被改變,而StringBuffer是可變類,當對象被創建后仍然可以對其值進行修改。由于String是不可變類,因此適合在需要被共享的場合中使用,而當一個字符串經常需要被修改時,最好使用StringBuffer來實現。如果用String來保存一個經常被修改的字符串時,在字符串被修改的時候會比StringBuffer多了很多附加的操作,同時生成了很多無用的對象,由于這些無用的對象會被垃圾回收器來回收,所以會影響程序的性能。在規模小的項目里面這個影響很小,但是在一個規模大的項目里面,這會對程序的運行效率帶來很大的影響。
StringBuilder也是可以被修改的字符串,它與StringBuffer類似,都是字符串緩沖區,但StringBuilder不是線程安全的,如果只是在單線程中使用字符串緩沖區,那么StringBuilder的效率會更高些。因此在只有單線程訪問的時候可以使用StringBuilder,當有多個線程訪問時最好使用線程安全的StringBuffer。因為StringBuffer必要時可以對這些方法進行同步,所以任意特定實例上的所有操作就好像是以串行順序發生的,該順序與所涉及的每個線程進行的方法調用順序一致。
String與StringBuffer另外一個區別在于,當實例化String的時候,可以利用構造方法(String s1=new String("world"))的方式來對其進行初始化,也可以用賦值(String s = "Hello")的方式來初始化,而StringBuffer只能使用構造方法(StringBuffer s=new StringBuffer("Hello"))的方式來初始化。
String字符串修改實現的原理為:當用String類型來對字符串進行修改時,其實現方法是首先創建一個StringBuilder,然后調用StringBuilder的append方法,最后調用StringBuilder的toString方法把結果返回。舉例如下:

以上代碼等價于下述代碼:

由此可以看出,上述過程比使用StringBuilder多了一些附加的操作,同時也生成了一些臨時的對象,導致程序的執行效率降低。為了更好地說明這一問題,下面分析一個示例。


程序運行結果為:

從程序的運行結果可以看出,當一個字符串需要經常被修改的時候,使用StringBuilder比使用String的性能要好很多。
在執行效率方面,StringBuilder最高,StringBuffer次之,String最低(StringTokenizer與前三者功能完全不同,故不適合放在一起排序),鑒于這一情況,一般而言,如果要操作的數據量比較小,優先使用String類,如果是在單線程下操作大量數據,優先使用StringBuilder類,如果是在多線程下操作大量數據,優先考慮StringBuffer類。
StringTokenizer是用來分割字符串的工具類,如下例所示:

程序運行結果為:

- C++面向對象程序設計(第三版)
- 青少年美育趣味課堂:XMind思維導圖制作
- C語言程序設計
- Scratch 3游戲與人工智能編程完全自學教程
- Visual C++開發入行真功夫
- Learning OpenStack Networking(Neutron)(Second Edition)
- 小程序,巧應用:微信小程序開發實戰(第2版)
- Java零基礎實戰
- Nagios Core Administration Cookbook(Second Edition)
- Java程序設計教程
- Spring Boot從入門到實戰
- 一覽眾山小:ASP.NET Web開發修行實錄
- React.js實戰
- 秒懂算法:用常識解讀數據結構與算法
- 算法技術手冊