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

今日の一杯 赤ワイン

2025/7/7

フェウド・アランチョ ネロ・ダーヴォラ レビュー|今日の一杯 赤ワイン

「フェウド・アランチョ ネロ・ダーヴォラ」は、味わい深く、コスパの良い、安定した品質の一本です。 トマト系の煮込み料理や、チーズをたっぷりのせたラザニアとも合い、もちろん、静かな夜にひとりでグラスを傾ける時間にもぴったり。 海外の専門家たちからも高評価を得ており、日常使いからしっかりした食事まで汎用的に活躍します。 味と風味 口に含むと、熟したダークベリーやラズベリーの果実味が広がりながら、後半にかけてほんのりドライハーブのような余韻が続きます。 酸味は控えめで、タンニンはしっかりしています。 飲みごたえ ...

続きを読む

エナジードリンク 今日の一杯

2025/6/30

ZONe ENERGY ABSOLUTE VICTORY 勝 レビュー|今日の一杯 エナジードリンク

ZONe ABSOLUTE VICTORYは2025年1月に発売されたエナジードリンクです。 受験勉強をイメージしたデザインの商品で、学問の神様として知られる菅原道真公を祀る太宰府天満宮に「HYPER ZONe 」を奉納し、受験生の合格を祈願しているそうです。 寒い冬に体を温めるように、成分にジンジャーシロップが配合されており、堅調に生姜の味がします。 カナダドライのジンジャーエールとはまた違う、比較的マイルドな飲みやすい生姜ジュースといった印象です。 ZONeの1本あたりのカフェイン量は75mgとコーヒ ...

続きを読む

  • この記事を書いた人

朝倉卍丸

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

よく読まれている記事

条件の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