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