Java String、StringBuffer、StringBuilderについて説明します.


JavaでStringを宣言する
1.new演算子の使用
String new_str1 = new String("Hello Java!");
String new_str2 = new String("Hello Java!");

System.out.println("new_str1 : " + System.identityHashCode(new_str1) + ", " + new_str1);
System.out.println("new_str2 : " + System.identityHashCode(new_str2) + ", " + new_str2);
結果
new_str1 : 918221580, Hello Java!
new_str2 : 1746572565, Hello Java!
  • 各Stringはhip領域に格納され、同じ文字列でも異なるメモリアドレスが表示されます.
  • String literal_str1 = "Hello Java!";
    String literal_str2 = "Hello Java!";
    
    System.out.println("literal_str1 : " + System.identityHashCode(literal_str1) + ", " + literal_str1);
    System.out.println("literal_str2 : " + System.identityHashCode(literal_str2) + ", " + literal_str2);
  • 各StringをString Constant pool領域に格納し、同じ文字列の文字で作成すると、同じメモリアドレスが表示されます.
  • 結果
    literal_str1 : 918221580, Hello Java!
    literal_str2 : 918221580, Hello Java!
    JavaでStringを使うべきでないとき!
    文字列アクション!(+、concat、substringなど…)
    JavaでString文字列を処理すると、毎回新しいインスタンスが生成されるため、パフォーマンスと速度が遅くなります.サンプルコードを見てみましょう.
    String literal_str1 = "Hello Java!";
    String literal_str2 = "Hello Java!";
    
    System.out.println("literal_str1   : " + System.identityHashCode(literal_str1) + ", " + literal_str1);
    // 문자열 연결
    literal_str1 = literal_str2.concat("?");
    System.out.println("literal_str1 : " + System.identityHashCode(literal_str1) + ", " + literal_str1);
    // 문자열 자르기(마지막 문자 제거)
    literal_str1 = literal_str1.substring(0, literal_str1.length() - 1);
    System.out.println("literal_str1 : " + System.identityHashCode(literal_str1) + ", " + literal_str1);
    結果
    literal_str1 : 918221580, Hello Java!
    literal_str1 : 1746572565, Hello Java!?
    literal_str1 : 989110044, Hello Java!
    既存の文字列
  • に追加し、削除時に新しいメモリアドレスに割り当てられていることを確認します.
  • StringBuilderとStringBufferを使います!
    StringBuilderとStringBufferはnew演算子でのみ文字列を生成できます.
    // StringBuffer
    StringBuffer sBuffer = new StringBuffer("Hello StringBuffer!");
    System.out.println("sBuffer : " + System.identityHashCode(sBuffer) + ", " + sBuffer);
    sBuffer.append("?");
    System.out.println("sBuffer : " + System.identityHashCode(sBuffer) + ", " + sBuffer);
    sBuffer.deleteCharAt(sBuffer.length()-1);
    System.out.println("sBuffer : " + System.identityHashCode(sBuffer) + ", " + sBuffer);
    
    // StringBuilder
    StringBuilder sBuilder = new StringBuilder("Hello StringBuilder!") ;
    System.out.println("sBuilder : " + System.identityHashCode(sBuilder) + ", " + sBuilder);
    sBuilder.append("?");
    System.out.println("sBuilder : " + System.identityHashCode(sBuilder) + ", " + sBuilder);
    sBuilder.deleteCharAt(sBuilder.length()-1);
    System.out.println("sBuilder : " + System.identityHashCode(sBuilder) + ", " + sBuilder);
    結果
    sBuffer : 918221580, Hello StringBuffer!
    sBuffer : 918221580, Hello StringBuffer!?
    sBuffer : 918221580, Hello StringBuffer!
    sBuilder : 989110044, Hello StringBuilder!
    sBuilder : 989110044, Hello StringBuilder!?
    sBuilder : 989110044, Hello StringBuilder!
  • の結果から、StringBufferとStringBuilderは文字列操作によってアドレスを変更しないことがわかります.
  • StringBuilderとStringBufferの違いは?
    Javaの正式なドキュメントでこれらの情報を見つけることができます.
    StringBuilder、StringBuffer公式ドキュメント
  • https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/lang/StringBuilder.html
  • https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/lang/StringBuffer.html
  • 要約すると...
  • StringBuilder:単一スレッド環境向けに設計されたクラスで、ほとんどの場合StringBufferよりもパフォーマンスが高速です.
  • StringBuffer:マルチスレッド環境に特化した設計で、スレッドを安全に処理できます.