String,StringBuffer,StringBuilder三者的區別
Java中String、StringBuffer、StringBuilder是編程中經常使用的字符串類,他們之間的區別也是經常在面試中會問到的問題。下面對這3個類進行總結:
運行速度
在這方面運行速度快慢爲:StringBuilder > StringBuffer > String
String爲字符串常量,因爲有“final”修飾符。Java中對String對象進行的操作實際上是一個不斷創建新的對象並且將舊的對象回收的一個過程,所以執行速度很慢。
而StringBuilder和StringBuffer均爲字符串變量,即String對象一旦創建之後該對象是不可更改的,但後兩者的對象是變量,是可以更改的。
線程安全
在線程安全上,StringBuilder是線程不安全的,而StringBuffer是線程安全的。
StringBuffer中很多方法可以帶有synchronized關鍵字,所以可以保證線程是安全的,但StringBuilder的方法則沒有該關鍵字,所以不能保證線程安全。
總結
- 如果要操作少量的數據用 = String
- 單線程操作字符串緩衝區 下操作大量數據用 = StringBuilder
- 多線程操作字符串緩衝區 下操作大量數據用 = StringBuffer
默認大小與擴容
StringBuffer類與 StringBuilder類均繼承了抽象類 AbstractStringBuilder類,默認長度都是16,使用可變的 char[] 擴容。查看API我們知道StringBuilder和StringBuffer有以下幾種構造方法:
StringBuilder的默認長度:
public final class StringBuilder extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
{
public StringBuilder() {
super(16);
}
}
StringBuffer的默認長度:
public final class StringBuffer extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
{
public StringBuffer() {
super(16);
}
}
添加字符串方式
StringBuffer類與 StringBuilder類均使用append方法添加字符串。
package com.demo.String;
public class StringTest {
public static void main(String[] args) {
StringBuilder stringBuilder=new StringBuilder();
StringBuffer stringBuffer=new StringBuffer();
String string="123";
stringBuffer.append(string);
stringBuilder.append(string);
}
}