【问题标题】:String with value null and memory allocation [duplicate]值为空的字符串和内存分配[重复]
【发布时间】:2015-01-06 12:46:15
【问题描述】:

如果一个字符串对象引用了一个空值,是否为这个值分配了内存?

例如String str = ""; String str = null;

str的值为null,或者空String,这个是分配在什么地方的吗?

TEXT ADDED当一个String引用指向null时会发生什么(你如何指定这个null并且仍然没有为这个“规范”分配内存?),这个信息是如何存储的?因为引用实际上存储了一个地址。

【问题讨论】:

标签: java string null heap-memory


【解决方案1】:
String nullObj = null;
String emptyStr= ""

两者完全不同。

null 的情况下,它什么都没有。但仍然分配内存。 null 32 位系统占用 4 个字节,64 位系统占用 8 个字节。

对于空字符串 (""),这是 100% 的字符串对象和内存分配。

【讨论】:

  • 虽然在"" 的情况下它可能已经被分配(实习)并且只是一个参考。
  • 对于字符串 str = null;没有内存分配,请记住,您需要将此值存储在某个地方...
【解决方案2】:

案例-1:

String s = null;

这里,内存只分配给引用 s。 null 不是对象。所以没有为此分配内存。

案例-2:

String s = ""`; // empty string 

这里,内存分配给字符串引用s以及实际的字符串值""(是的,""null不同)

【讨论】:

  • 那么引用指向null,这是如何存储的?因为引用实际上是存储一个地址
  • @aurelius - 在 JVM 中,指向 null 的引用的处理方式不同。因此,如果您有String s = null,则底层字节码指令将是aconst_null,后跟astore_1(在变量s 中存储空引用)。这意味着null 值使用不同的操作码以不同的方式处理。
  • 所以实际上,如果 JVM 生成一些代码,特定于这个空值,那么就会分配一些内存......
  • @aurelius - 1. 在这里,编译器生成将由JVM 运行的代码:)。接下来,不要混淆instructionsobjectsaconst_null 是一个指令。没有名为null 的对象占用内存。只有加载这个空引用的字段(s)会占用4字节/8字节,具体取决于系统是32位还是64位。
  • @aurelius - null 常量引用被推送到变量 s
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-06
  • 1970-01-01
  • 2015-01-27
相关资源
最近更新 更多