以前、Java で文字列の結合にかかる時間の比較を行いましたが、 StringBuilder と StringBuffer の違いについて JDK のソースコードを読んでみることにしました。
ソースファイルのどの部分に記述されているのか検索しながら探すのは大変なので、 Eclipse の機能を利用しました。
Eclipse で適当にクラスを作り、 append() にカーソルを置いて F3 キーを押すと宣言部を探して表示してくれます。
いくつものクラスを継承・実装しているクラスの場合にとても便利です。
public class Sample {
public static int main() {
StringBuilder sb1 = new StringBuilder();
sb1.append("a");
StringBuffer sb2 = new StringBuffer();
sb2.append("a");
return 0;
}
}(色を変えてある所にカーソルを置いて"F3"キーを押す)
StringBuilder と StringBuffer は両方とも AbstractStringBuilder を実装(implements)しています。
両者の違いを簡単に言うと StringBuffer の各メソッドはほぼすべて Synchronized メソッドとしてオーバーライドされています。
オーバーライドしていますが、ほぼ親クラスのメソッドを呼び出しているだけです。
そのほか大きな違いはありません。
つまり、 実行速度の差は Synchronized によるロック獲得の為のオーバーヘッドと言うことですね。