このテストを見てください
String s1 = "1234";
String s2 = "123";
Field field = String.class.getDeclaredField("value");
field.setAccessible(true);
char[] value1 = (char[]) field.get(s1);
char[] value2 = (char[]) field.get(s2);
System.out.println(value1 == value2);
これは出力さfalse
れ、JVMがs1とs2に対して2つの異なるchar配列を保持していることを意味します。s1とs2が同じchar配列を共有できない理由を誰かが説明できますか?java.lang.Stringはコンテンツ共有用に設計されたようですね。
注:すべてのJVMについてはわかりません。これは、OracleのJava HotSpot(TM)クライアントVM 22.1-b02(JRE 1.7)です。
アップデート
一方、部分的な共有がまれな場合(String.substringによって作成された文字列のみのようです)、なぜすべての文字列int count
にint offset
フィールドが必要なのですか?無駄な8バイトです。これはサイズだけでなく、作成速度でもあります。オブジェクトが大きいほど、初期化が長くなります。これがテストです
long t0 = System.currentTimeMillis();
for (int i = 0; i < 10000000; i++) {
new String("xxxxxxxxxxxxx");
}
System.out.println(System.currentTimeMillis() - t0);
約200msかかります。このクラスを使用する場合
class String2 {
char[] value;
String2(String2 s) {
value = s.value;
}
}
約140ミリ秒かかります。