我正在查看 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 位模式,我应该计算:4 个字节用于引用“值 []”,4 个字节用于偏移量,4 个字节用于计数,4 用于哈希类 String 的所有实例? 这意味着写“String x;” 在我的一个班级中,我的班级的“权重”自动增加了至少 32 个字节(我可能在这里错了)。