Java内存中究竟是什么null

时间:2011-11-30 03:29:08

标签: java null

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

String str = null; 
  • 是否为变量str分配了内存?
  • 如果已分配,将分配多少字节?
  • 如果没有分配,JVM如何知道有一些名为str的变量已被声明?
  • 如果已分配并且内存中有null值,那么null在二进制文件中的确切表示是什么?

5 个答案:

答案 0 :(得分:8)

当您执行以下操作时:

String str = null;

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

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

答案 1 :(得分:3)

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

为参考变量本身分配空间,无论其值如何。 Null只是一个适合这个空间的值。

回答具体例子的每个问题。

  • 是的,为变量str分配了空间。
  • 为参考变量分配的内存大小可能是四个字节。
  • 它被分配,JVM遵循已编译代码的指令来访问它。
  • 没关系。

答案 2 :(得分:2)

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

回答你的问题:

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

答案 3 :(得分:1)

Java适用于引用。想想String str=null,因为你在C中有指针,但不完全是指针。

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

答案 4 :(得分:0)

完成这一行之后:

String str = null; // or String str;

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