gpt4 book ai didi

java - 零长度数组在内存中是如何表示的?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:41:23 27 4
gpt4 key购买 nike

Java 原语对象被映射到原生原语。
所以我的问题是 char value[] = new char[0]; 是如何表示的?
它是否取决于( native 代码的)gcc 编译器实现?这是否意味着所有空的 Java String 都指向同一个地址?

最佳答案

Java 数组是对象。它们继承自 Object 类。

JVM 规范不规定对象的任何特定实现,前提是它们的行为符合规范。在实践中,它是通过 header 后跟对象的实际字段来实现的。

Java 中的数组只是其原始组件的序列。它是一个对象,具有 length 字段,并且具有方法。因此,与任何其他对象一样,它具有标题,后跟长度,然后是所有数组组件。

分配大小为零的数组是一个具有标题和大小但没有为实际组件分配空间的对象。

对数组的引用就像对任何其他对象的引用。 Java 中的数组与 C 中的数组不同,如果数组的大小为零,则指向其开始的指针实际上是无效的。对数组的引用指向数组对象,它的长度恰好为零并且没有实际项。如果您尝试寻址此类数组中的任何元素,则不会存在有效指针的问题。数组引用本身指向一个有效的对象。然后,边界检查将显示任何索引超出范围,因此不会发生进一步的指针取消引用。

所以最重要的是,对 char[0] 的引用是对实际分配对象的有效引用。它只是没有超出长度的数据。

这与 null 不同,后者是位全为零的引用,因此根本不指向任何地方。除了引用本身之外,没有分配内存,而对于 char[0] ,分配了足够的内存用于 header 和长度。


对于字符串来说,两个空字符串不一定指向同一个字符数组。例如,如果您这样写:

String a = new String();
String b = new String();

您将获得两个不同的空字符串对象。它们中的每一个都有一个它指向的不同的空字符数组。这是因为 String 类的无参数构造函数是这样实现的:

public String() {
this.value = new char[0];
}

您看到 new 关键字的使用了吗?这意味着分配了一个新的数组对象,而不是从任何地方复制。

但是请注意,如果您的来源是:

String a = "";
String b = "";

然后由于实习,它们将指向同一个字符串对象,从而指向同一个字符数组。另外,如果是:

String a = new String();
String b = new String(a);

那么您将拥有两个不同的 String 对象,但它们都指向同一个内部字符数组。这是因为第二行的构造函数是:

public String(String original) {
this.value = original.value;
this.hash = original.hash;
}

同样,指向空字符串的指针肯定与空指针不同。它指向一个实际的字符串对象,该字符串对象指向一个实际的字符数组对象。

关于java - 零长度数组在内存中是如何表示的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30132902/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com