使用感String s1 = "hello";
とString s2 = new String("hello");
微妙な違いがあります。
public static void main(String[] arg ) {
String s1 = "Java";
String s2 = "Java";
String s3 = new String("Java");
System.out.println(s1==s2); //true
System.out.println(s1==s3); //false
StringBuilder sb = new StringBuilder(25); //initial capacikacity
sb = new StringBuilder(10);
sb.append(s1).append(" uses immutable strings.");
sb.setCharAt(20, 'S');
System.out.println(sb);
}
上記のコードでは、「Java」は文字列リテラルとして知られています。メモリを節約するために、これはコードに表示されますが、どちらも同じ文字列リテラルであるため、s1 と s2 は実際にはメモリ内の同じオブジェクトを参照します。確かs1.equals(s3)
にそうですが、上記のようにメモリ内の同じオブジェクトを参照していません。
実際には、常に.equals
文字列を比較するために使用しますが、文字列は不変であるため、s1 が参照するデータを変更することはできません (少なくとも簡単ではありません)。しかし、s1 が参照するデータを変更できれば、s2 もそれに伴って変更されます。
StringBuilder を使用すると、基になるデータを変更できます。上記のように、ある String を別の String に追加するためによく使用します。StringBuilder sb2 = "what?"
StringBuilders の場合、それらのうちの 2 つが同じデータを参照する (sb1==sb2 を意味する) と、sb1 の変更が sb2 の予期しない変更を引き起こすという問題が発生する可能性が高くなるため、これは違法です。