天天看點

Java String StringBuffer StringBuilder

1. String儲存的字元常量不可改變

看例子:

String a="1";

a="2";

1

2

此處,先是"1"在記憶體開辟空間存儲,然後a儲存的是"1"的位址。在執行a=“2"時,注意不是将a指向位址的内容更換為"2”,而是又開辟了空間存儲"2",然後把新的位址賦給了a。

也就說是,像"1"、“2”、“hello”等字元串常量是不可改變的,而a這種字元串對象儲存的值是可以改變的,是以會發生這樣的情況。

是以,考慮如下場景,要反複的修改字元串内容,則會反複的在新的位址空間存放新的字元串,最終會占用很多空間,垃圾收集器不得不更加頻繁的收集垃圾,導緻性能降低。

2. StringBuffer可以修改儲存的内容

StringBuffer sb=new StringBuffer("1");

sb.append("2");

首先sb儲存的位址是"1"的位址,第二步時,該位址内容改為“12",沒有使用新的位址。

是以當需要頻繁的修改字元串時,建議使用StringBuffer類。

3. StringBuffer與StringBuilder

這兩個類的方法是完全一樣的,例如常用的:

append(T)    追加

insert(int,T)    插入

delete(int,int)  删除

唯一的差別是,StringBuffer類中的方法定義使用了synchronized進行修飾,表示StringBuffer中的方法都是同步方法,是線程安全的,而StringBuilder中的方法沒有synchronized修飾,屬于異步方法,線程不安全的。

老兄,如果不确定或者搞不懂是否需要線程安全,直接用StringBuffer,完事,可想而知安全需要代價,StringBuffer性能稍微差一點點。