【发布时间】:2023-03-22 11:10:01
【问题描述】:
如果我声明一些字符串变量,例如
String str = null;
- 是否为变量
str分配了内存? - 如果已分配,将分配多少字节?
- 如果没有分配,JVM怎么知道有一个变量
str被声明了? - 如果已分配且内存中有
null值,那么null的二进制表示究竟是什么?
【问题讨论】:
如果我声明一些字符串变量,例如
String str = null;
str 分配了内存? str被声明了?null 值,那么null 的二进制表示究竟是什么?【问题讨论】:
当您执行以下操作时:
String str = null;
唯一分配的是对字符串的引用(这类似于包含指针类型的语言中的字符串指针)。此引用是一个 32 位或 64 位变量(取决于您的硬件架构和 Java 版本),它驻留在堆栈中(可能取决于放置声明的确切上下文)。
不应为null 本身分配内存,因为null 实际上不是一个有效的对象实例。它只是一个占位符,指示对象引用当前未引用对象。可能它只是文字值0,因此将对象引用分配给null 相当于在C/C++ 中将指针类型设置为NULL。但最后一点是我的猜测。
【讨论】:
Null 是未绑定到对象的引用的值。
空间是为引用变量本身分配的,不管它的值是多少。 Null 只是一个适合该空间的值。
针对具体示例回答每个问题。
【讨论】:
看看这个 Java IAQ(不常见的问题)“Is null an object?”。
回答您的问题:
【讨论】:
Java 处理引用。想想String str=null,因为您在 C 中有指针,但不完全是指针。
现在内部表示取决于 JVM。计算参考的大小并不容易。每个 JVM 的实现都不同,因此没有必要提取低级信息。
【讨论】:
做完这一行之后:
String str = null; // or String str;
只有String 类型的引用被分配到堆栈中。 null 表示您没有将任何值(对象)分配给堆中的引用 str。
【讨论】: