JavaのStringとStringBufferの違い

Java

StringとStringBufferの違い [Java]

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
  • この記事を書いた人

朝倉卍丸

シングルモルトスコッチなどのお土産を持ってきた人を助けるのが好きです。サービスの分割が重要ですが、まあ昔ながらの方法でやりたいこともありますよね。

よく読まれている記事

条件の0=0は全てが正であるを意味するSQL 1

SQLの条件に0=0のような記述を見かけます。 変わった書き方の条件ですが、これは「全てが正である」事を意味しており、結合条件の場合はCROSS JOINと同じです。 下記の例で言えば、結合するsub ...

DISTINCTを使わないで重複排除を考えるSQL 2

SQLのDISTINCTはEXISTSとかGROUP BYでなんとかする事もできます。 DISTINCTは暗黙的なソートがされますが、何のDBを使うにせよ過去のバージョンならともかく、最近のバージョン ...

RFC 5322に準拠させた正規表現言語別 3

RFC5322で定義されている正規表現を、各言語の正規表現に変化させた形になります。 完全な電子メール正規表現は存在しないので、結局のところ何かの公式基準に従っていたとしても、自分が携わるサービスのル ...

-Java