Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 零长度数组在内存中是如何表示的?_Java_Arrays_String_Char_Native Code - Fatal编程技术网

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

Java 零长度数组在内存中是如何表示的?,java,arrays,string,char,native-code,Java,Arrays,String,Char,Native Code,Java原语对象映射到本机原语。 所以我的问题是,char值[]=new char[0]是怎样的正在被表示? 它是否依赖于(本机代码的)gcc编译器实现?这是否意味着所有空JavaStrings都指向同一地址?使用new创建的两个不同对象在引用相等性方面必须是不同的,因此不,它们不是同一个对象 另外,对常量字符串“”的任何两个JavaString引用都将引用同一个对象,因为编译时常量字符串被插入。内存布局未定义,因为它是一个实现细节 以下是他们的64位JVM: 64位用于类指针(即信令char)

Java原语对象映射到本机原语。
所以我的问题是,
char值[]=new char[0]是怎样的正在被表示?

它是否依赖于(本机代码的)gcc编译器实现?这是否意味着所有空Java
String
s都指向同一地址?

使用
new
创建的两个不同对象在引用相等性方面必须是不同的,因此不,它们不是同一个对象


另外,对常量字符串“”的任何两个Java
String
引用都将引用同一个对象,因为编译时常量字符串被插入。内存布局未定义,因为它是一个实现细节

以下是他们的64位JVM:

  • 64位用于类指针(即信令
    char
  • 64位表示标志(例如,表示此对象是数组)
  • 64位用于锁数据(用于同步)
  • 数组长度为64位(仅使用32位,但字段边界对齐)
  • 0位表示数据,因为数组没有元素
  • 总共是256位或32字节


    在Java中,
    String
    char[]
    不是一回事。
    字符串
    将是一个单独的对象,其中包含对
    char[]
    的引用

    因为每个数组对象都有属性,所以在写入时

    char a[] = new char[0];
    
    然后
    length
    属性获取值0,该值表示数组的大小。
    length
    字段是4个字节,数组的正常头通常是8个字节

    空数组没有什么特别之处,它与任何其他数组一样,但不包含元素


    值得一提的是,空数组和初始化为
    null
    的数组是两种不同的东西。例如,有时从方法返回空数组比从对象返回空数组更容易。它们继承自
    对象

    JVM规范不规定对象的任何特定实现,只要它们按照规范进行操作。在实践中,它是通过一个头部,后跟对象的实际字段来实现的

    Java中的数组不仅仅是其基本组件的序列。它是一个对象,它有
    长度
    字段,它有方法。因此,与任何其他对象一样,它具有头,后跟长度,后跟所有数组组件

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

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

    因此,底线是对
    char[0]
    的引用是对实际分配对象的有效引用。它只是没有超出长度的数据

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


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

    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);
    
    然后会有两个不同的
    字符串
    对象,但它们都指向同一个内部字符数组。这是因为第二行的构造函数是:

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

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

    Java原语不一定映射到本机原语。Java int是4字节,即使它是在8位体系结构上实现的。Java字符总是两个字节。您是指
    字符串
    对象本身还是字符串的字符内部表示形式?空字符串将是长度为
    0
    的对象,并且该长度应存储在某个位置。所有的空字符串是否都指向同一个地址有关系吗?@CaptainMan:internalrepresentation@Jim,空数组和空数组完全不同,不能相互交换。所以
    char[0]
    是有效的内存地址吗?因为我认为这是编译器的某种“语法”糖分,所以,
    newchar[0]
    创建了一个新的、完全有效的空数组对象。空数组对象是什么意思?这是一个长度为0的数组。这个“完全有效的空数组对象”的表示形式是什么?是的,它是一个长度为0的数组。在32位热点上,数组由所有对象的常规8字节头、长度字段的4字节以及数组的内容表示,零长度数组的工作方式与任何其他数组的工作方式相同。其工作方式始终相同。它被四舍五入为倍数