【问题标题】:What exactly is null in Java memory [duplicate]Java内存中的null到底是什么[重复]
【发布时间】:2023-03-22 11:10:01
【问题描述】:

如果我声明一些字符串变量,例如

String str = null; 
  • 是否为变量str 分配了内存?
  • 如果已分配,将分配多少字节?
  • 如果没有分配,JVM怎么知道有一个变量str被声明了?
  • 如果已分配且内存中有null 值,那么null 的二进制表示究竟是什么?

【问题讨论】:

    标签: java null


    【解决方案1】:

    当您执行以下操作时:

    String str = null;
    

    唯一分配的是对字符串的引用(这类似于包含指针类型的语言中的字符串指针)。此引用是一个 32 位或 64 位变量(取决于您的硬件架构和 Java 版本),它驻留在堆栈中(可能取决于放置声明的确切上下文)。

    不应为null 本身分配内存,因为null 实际上不是一个有效的对象实例。它只是一个占位符,指示对象引用当前未引用对象。可能它只是文字值0,因此将对象引用分配给null 相当于在C/C++ 中将指针类型设置为NULL。但最后一点是我的猜测。

    【讨论】:

    • 如果值 0 上的点为真,则 int j = null;可以工作,但在编译时它已经失败了
    【解决方案2】:

    Null 是未绑定到对象的引用的值。

    空间是为引用变量本身分配的,不管它的值是多少。 Null 只是一个适合该空间的值。

    针对具体示例回答每个问题。

    • 是的,为变量 str 分配了空间。
    • 为引用变量分配的内存大小可能是四个字节。
    • 被分配,JVM按照编译后代码的指令来访问它。
    • 没关系。

    【讨论】:

      【解决方案3】:

      看看这个 Java IAQ(不常见的问题)“Is null an object?”。

      回答您的问题:

      • 只分配存储引用的内存
      • Java 标准没有指定引用占用多少内存(尽管实际上它通常是 32 位或 64 位,具体取决于您的 JVM - although some JVMs try to beat this
      • null 的内存表示无关紧要,因为您不能对其进行位级操作(或将其分配给任何非引用)

      【讨论】:

        【解决方案4】:

        Java 处理引用。想想String str=null,因为您在 C 中有指针,但不完全是指针。

        现在内部表示取决于 JVM。计算参考的大小并不容易。每个 JVM 的实现都不同,因此没有必要提取低级信息。

        【讨论】:

          【解决方案5】:

          做完这一行之后:

          String str = null; // or String str;
          

          只有String 类型的引用被分配到堆栈中。 null 表示您没有将任何值(对象)分配给堆中的引用 str

          【讨论】:

            猜你喜欢
            • 2014-10-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-05-21
            • 2011-04-24
            • 1970-01-01
            • 2011-11-09
            相关资源
            最近更新 更多