題目 String、StringBuilder、StringBuffer有什麼異同? 解答 相同點:String、StringBuilder、StringBuffer都可以用來存儲字元串。 不同點: 1、String與StringBuilder、StringBuffer的不同點主要在於,String ...
題目
String、StringBuilder、StringBuffer有什麼異同?
解答
相同點:String、StringBuilder、StringBuffer都可以用來存儲字元串。
不同點:
1、String與StringBuilder、StringBuffer的不同點主要在於,String對象創建之後,是不可改變的,平時我們對同一個String變數賦值,實際上是創建了個新的對象。而後兩者是可變的,這意思就是說,他們可以在同一記憶體地址上更改它的值,而無需創建新的對象。
2、StringBuilder與StringBuffer的不同點在於,StringBuffer是線性安全的,但是它比StringBuilder要慢。
參考代碼
StringBufferThreadSafeTest
package me.huangzijian; public class StringBufferThreadSafeTest { public static void main(String[] args) { //測試StringBuffer線程安全部分 String s = "123456789"; StringBuffer stringBuffer = new StringBuffer(s); StringBuilder stringBuilder = new StringBuilder(s); SbfReverseThread sbfRT1 = new SbfReverseThread(stringBuffer); SbfReverseThread sbfRT2 = new SbfReverseThread(stringBuffer); SbdReverseThread sbdRT1 = new SbdReverseThread(stringBuilder); SbdReverseThread sbdRT2 = new SbdReverseThread(stringBuilder); new Thread(sbfRT1).start(); new Thread(sbfRT2).start(); new Thread(sbdRT1).start(); new Thread(sbdRT2).start(); //測試StringBuffer比StringBuilder慢部分,註意不要同時運行兩個迴圈,一次運行一個,這樣才精確 long startTime2 = System.currentTimeMillis(); for (int i = 0; i <= 10000000; i++) { stringBuffer.reverse(); } long endTime2 = System.currentTimeMillis(); System.out.println("StringBuffer迴圈1000次所需時間:" + (endTime2 - startTime2) + "ms"); long startTime1 = System.currentTimeMillis(); for (int i = 0; i <= 10000000; i++) { stringBuilder.reverse(); } long endTime1 = System.currentTimeMillis(); System.out.println("StringBuilder迴圈1000次所需時間:" + (endTime1 - startTime1) + "ms"); } }
SbfReverseThread
package me.huangzijian; public class SbfReverseThread implements Runnable { StringBuffer stringBuffer; public SbfReverseThread(StringBuffer stringBuffer) { this.stringBuffer = stringBuffer; } @Override public void run() { for (int i = 0; i <= 1000; i++) { try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } stringBuffer.reverse(); System.out.println("StringBuffer:" + stringBuffer); } } }
SbdReverseThread
package me.huangzijian; public class SbdReverseThread implements Runnable { StringBuilder stringBuilder; public SbdReverseThread(StringBuilder stringBuilder) { this.stringBuilder = stringBuilder; } @Override public void run() { for (int i = 0; i <= 1000; i++) { try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } stringBuilder.reverse(); System.out.println("StringBuilder:" + stringBuilder); } } }
從結果可以看出:
1.StringBuilder對於字元串123456789,兩個線程運行到一段時間,就開始混亂,不再是123456789或者987654321了,而StringBuffer無論重覆多少次,依然是123456789或者987654321。
2.我機器上,StringBuffer字元串反轉運行10000000,用時370ms足有,而StringBuilder字元串反轉運行10000000,只需要150ms左右,可見StringBuilder比StringBuffer快。