編譯環境:OpenJDK 11
先上代碼:
public class Test {
public static void main(String[] args) {
final int n = Integer.parseInt(args[0]);
System.out.println("String:" + getTime(getStringTime(n)));
System.out.println("StringBuffer:" + getTime(getStringTime(n)));
System.out.println("StringBuilder:" + getTime(getStringTime(n)));
}
static String getTime(long time) {
return Double.toString((double) time / 1000);
}
static long getStringTime(int times) {
String string = "";
long t1 = System.currentTimeMillis();
for (int i = 0; i < times; i++) {
string += ' ';
}
long t2 = System.currentTimeMillis();
return t2 - t1;
}
static long getStringBufferTime(int times) {
StringBuffer stringBuffer = new StringBuffer();
long t1 = System.currentTimeMillis();
for (int i = 0; i < times; i++) {
stringBuffer.append(' ');
}
long t2 = System.currentTimeMillis();
return t2 - t1;
}
static long getStringBuilderTime(int times) {
StringBuilder stringBuilder = new StringBuilder();
long t1 = System.currentTimeMillis();
for (int i = 0; i < times; i++) {
stringBuilder.append(' ');
}
long t2 = System.currentTimeMillis();
return t2 - t1;
}
}
String,StringBuffer,StringBuilder各回圈1000000萬次,兩次測驗結果分別如下圖所示
在自己的電腦上測驗的結果(CPU:i7 9700)

在ECS服務器上測驗的結果(CPU:云ECS學生機1核CPU)

結論:String,StringBuffer和StringBuilder在現代處理器單執行緒下性能差異并不大,后兩者性能略高于String,而由于String在自增程序中是存在新建物件操作的,所以占用記憶體方面大于后兩者,同時由于產生了垃圾物件,gc也會造成一定的計算開支,因此處理可變長字串時,在單執行緒應用場景下應使用StringBuilder獲得更高性能,而在多執行緒應用場景下應使用StringBuffer來確保執行緒安全,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/107437.html
標籤:Java
上一篇:IDEA中配置Maven
