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
到堆中。