Java - null变量是否需要内存空间

Yat*_*oel 64 java

class CheckStore {
    private String displayText;
    private boolean state;
    private String meaningfulText;
    private URL url;

    public CheckStore(String text, boolean state) {
        this.displayText = text;
        this.state = state;
    }
    :
    :
}
Run Code Online (Sandbox Code Playgroud)

由于我只在构造函数中初始化两个变量(displayTextstate),其余两个变量(meaningfulText以及url具有该值的变量null)是否需要内存空间来存储null值.

Q1.我认为他们需要空间.如果他们愿意,那么一个int值在内存中占用多少内存(比如displayText需要4个字节).

Q2.字符串在内存中占用多少空间.我想这将取决于字符串的长度.那么一个字符串需要多长的空间?

dsi*_*cha 58

在Java中,null只是一个引用(基本上是一个受限制的指针)可以拥有的值.这意味着参考没有任何意义.在这种情况下,您仍然占用参考空间.这是32位系统上的4个字节或64位系统上的8个字节.但是,在实际分配该类的实例以指向引用之前,您不会为引用指向的类消耗任何空间.

编辑:就字符串而言,StringJava中的每个字符需要16位(2个字节),加上少量的簿记开销,这可能是未记录的,并且是特定于实现的.

  • 不一定...... HotSpot中有一些有趣的工作可以避免这种情况:http://wikis.sun.com/display/HotSpotInternals/CompressedOops (10认同)
  • @JonSkeet共享的原始链接已经死亡.后来者可以参考http://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7.html和https://wiki.openjdk.java.net/display/HotSpot/ CompressedOops (3认同)
  • @Yatendra:指针必须足够大以跨越整个地址空间。因此,在 32 位机器上,您需要 32 位。在 64 位机器上,您需要 64 位。 (2认同)
  • @Jon Skeet:非常有趣,我没有意识到这一点.我会改写它们:在缺少非常聪明且无法保证的JIT优化的情况下,如果你有64位地址空间,则需要64位引用. (2认同)

Jac*_*cky 12

我想补充一下:

  1. 引用类型的变量将初始化为空值.
  2. null不是对象.因为(null instanceof Object)等于false
  3. JVM中只有一个空值.无论有多少变量引用null.

    Object s =(String)null;

    对象i =(整数)null;

    System.out.println(s == i); // true

  • 1. *Member* 引用类型的变量被初始化为空。局部变量不是。2. Null 不是`Object`,不是因为`null instanceof Object` 是假的,而是因为null 是一个引用。3. JVM 中的空值与由 (a) `aconst_null` 操作码 (b) 成员变量初始化 (c) 等创建的一样多。该语句没有意义。`null` 总是等于它自己,但这并不意味着任何关于身份的事情。 (2认同)