JavaのStringとStringBufferには複数の違いがあります。
以下に、StringとStringBufferの相違点を列挙します。
| String | StringBuffer | |
| 1 | Stringクラスはイミュータブル | StringBufferクラスはミュータブル |
| 2 | Stringは、多くの文字列を連結すると、その都度新しいインスタンスを生成するため、速度が遅く、メモリ消費量も多くなります | StringBufferは、文字列の連結が多い場合、高速に動作し、メモリ消費量も少なくなります |
| 3 | StringクラスはObjectクラスのequals()メソッドをオーバーライドしています。そのため、equals()メソッドで2つの文字列の内容を比較することができます | StringBufferクラスは、Objectクラスのequals()メソッドをオーバーライドしていません |
| 4 | String クラスは、連結処理に時間がかかる | StringBufferクラスの方が連結処理が高速 |
| 5 | Stringクラスは、String定数プールを使用します | StringBuffer はヒープメモリを使用します |
StringとStringBufferの性能
StringクラスとStringBufferクラスを使って、文字列を連結するのに必要な時間を計算したものです。
public class ConcatTest{
public static String concatWithString() {
String t = "Java";
for (int i=0; i<10000; i++){
t = t + "Tpoint";
}
return t;
}
public static String concatWithStringBuffer(){
StringBuffer sb = new StringBuffer("Java");
for (int i=0; i<10000; i++){
sb.append("Tpoint");
}
return sb.toString();
}
public static void main(String[] args){
long startTime = System.currentTimeMillis();
concatWithString();
System.out.println("Time taken by Concating with String: "+(System.currentTimeMillis()-startTime)+"ms");
startTime = System.currentTimeMillis();
concatWithStringBuffer();
System.out.println("Time taken by Concating with StringBuffer: "+(System.currentTimeMillis()-startTime)+"ms");
}
}
//Time taken by Concating with String: 578ms
//Time taken by Concating with StringBuffer: 0ms
StringとStringBufferのHashCode
以下のプログラムを見ると、Stringは連結して新しいハッシュコードを返しますが、StringBufferクラスは同じハッシュコードを返します。
public class InstanceTest{
public static void main(String args[]){
System.out.println("Hashcode test of String:");
String str="java";
System.out.println(str.hashCode());
str=str+"tpoint";
System.out.println(str.hashCode());
System.out.println("Hashcode test of StringBuffer:");
StringBuffer sb=new StringBuffer("java");
System.out.println(sb.hashCode());
sb.append("tpoint");
System.out.println(sb.hashCode());
}
}
//Hashcode test of String:
//3254818
//229541438
//Hashcode test of StringBuffer:
//118352462
//118352462