nmtysh.log

Tech系のネタや日々の独り言などを書いています。

Java: StringBuilder と StringBuffer の違い

以前、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 によるロック獲得の為のオーバーヘッドと言うことですね。

 

 

ソースを見て思ったのですが、オーバーライドしているメソッドには @Override アノテーションを付けて欲しいです。

どのメソッドがオーバーライドメソッドなのか一見して区別が付きません。