String の openjdk 実装と、インスタンスごとのプライベート メンバーは次のようになっています。
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence
{
/** The value is used for character storage. */
private final char value[];
/** The offset is the first index of the storage that is used. */
private final int offset;
/** The count is the number of characters in the String. */
private final int count;
/** Cache the hash code for the string */
private int hash; // Default to 0
[...]
}
しかし、重複を避けるために、Java は文字列の参照とプールを使用することを知っています。私は単純に pimpl イディオムを期待していましたが、実際には String は impl への参照にすぎません。私は今のところそれを見ていません。String x; を配置した場合、Java が参照の使用をどのように認識するかを誰かが説明できますか? 私のクラスのメンバー?
補遺: これはおそらく間違っていますが、32 ビット モードの場合は、カウントする必要があります: 参照 "value[]" に 4 バイト、オフセットに 4 バイト、カウントに 4 バイト、クラス String のすべてのインスタンスのハッシュに 4 ? これは、「String x;」と書くことを意味します。私のクラスの1つで、クラスの「重み」に少なくとも32バイトが自動的に追加されます(おそらくここで間違っています)。