在Java内存中,null到底是什么?

6
如果我声明了一些字符串变量,比如:
String str = null; 
  • 变量str是否分配了内存?
  • 如果已分配,将分配多少字节?
  • 如果没有分配,JVM如何知道有一个名为str的变量已被声明?
  • 如果已分配,且内存中存在null值,则null在二进制中的表示是什么?
5个回答

9

当你执行以下操作时:

String str = null;

唯一分配的是对字符串的引用(这类似于包含指针类型的语言中的字符串指针)。该引用是一个32位或64位变量(取决于您的硬件架构和Java版本),它驻留在堆栈上(可能,具体取决于声明所处的确切上下文)。 null本身不应分配任何内存,因为null实际上不是有效的对象实例。它只是一个占位符,表示对象引用当前未引用对象。它可能只是文字值0,使得将对象引用赋值给null等同于在C/C++中将指针类型设置为NULL。但最后一点是我自己的推测。

如果关于值为0的点是真的,那么int j = null;就可以工作,但它在编译时已经失败了。 - Oleksii Kyslytsyn

3

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

无论其值如何,都会为引用变量本身分配空间。 Null只是适合此空间的值。

针对特定示例回答每个问题:

  • 是的,为变量str分配了空间。
  • 分配给引用变量的内存大小可能为四个字节。
  • 已分配,并且JVM按照编译代码的指令进行访问。
  • 无所谓。

2
请看这个关于Java IAQ(不常被问及的问题)"null是一个对象吗?"。
回答您的问题:
  • 只分配了存储引用的内存。
  • Java标准并没有指定引用占用多少内存(虽然在实践中,它通常是32位或64位,取决于您的JVM - 尽管有些JVM试图突破这个限制)。
  • 空的内存表示并不重要,因为您不能对其进行位级操作(或将其分配给任何不是引用的东西)。

1

Java使用引用。将String str=null视为C语言中的指针,但并非完全相同。

现在,内部表示取决于JVM。计算引用的大小并不容易。实现因JVM而异,因此提取该低级信息没有意义。


0

在执行这行代码之后:

String str = null; // or String str;

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接