官术网_书友最值得收藏!

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是用來分割字符串的工具類,如下例所示:

程序運行結果為:

主站蜘蛛池模板: 扎赉特旗| 栾城县| 榆社县| 嘉禾县| 昌平区| 绥滨县| 荆州市| 扶绥县| 武功县| 环江| 张家港市| 孙吴县| 济宁市| 高清| 额济纳旗| 凉山| 定安县| 拜泉县| 左权县| 海晏县| 泸水县| 舟曲县| 南华县| 菏泽市| 宽甸| 平江县| 灵石县| 盐源县| 长兴县| 大理市| 平定县| 太和县| 托克逊县| 涟水县| 钟山县| 东乌| 惠水县| 敖汉旗| 莱芜市| 建瓯市| 开远市|