Java内存中究竟是什么null

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

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

当你做类似的事情:

 String str = null; 

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

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

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

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

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

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

看看这个Java IAQ(不经常问的问题)“ null是一个对象吗? ”。

回答你的问题:

  • 仅分配用于存储引用的存储器
  • java标准没有指定引用占用多少内存 (尽管实际上它通常是32位或64位,具体取决于您的JVM – 尽管有些JVM试图击败它 )
  • null的内存表示无关紧要,因为您无法对其执行位级操作(或将其分配给任何非引用的操作)

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

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

做完这一行之后:

 String str = null; // or String str; 

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