数组类如何在Java中工作?

在Java中,array是一个类并扩展了Object。 我很想知道这个特殊的数组类。 我没有在任何地方找到类定义。 执行getClass()。getName()会得到奇怪的结果。

String[] array = new String[]{"one","two"}; System.out.println(array.getClass().getName()); // prints [Ljava.lang.String; 

我想了解arrays是如何工作的。 数组类定义是否在JVM中进行了硬编码?

任何资源,书籍,链接都会对您有所帮助。

谢谢。

是的,基本上数组是VM密切关注的东西,比如原始类型。 有特定的字节码指令可以使用数组 – 创建它们,索引它们等。

至于资源以找到更多 – JVM规范可能是最好的起点。 第7.9节有一些使用数组的字节码示例。

关于数组类名

Class.getName清楚地指定了这些“时髦”数组名称:

如果此类对象表示不是数组类型的引用类型,则返回类的二进制名称,如Java语言规范第二版所指定。

如果此类对象表示基本类型或void,则返回的名称是一个String等于与基本类型或void相对应的Java语言关键字。

如果此类对象表示一个数组类,则名称的内部forms由元素类型的名称组成,前面有一个或多个'['字符,表示数组嵌套的深度。 元素类型名称的编码如下:

 Element Type Encoding boolean Z byte B char C double D float F int I long J short S class or interface Lclassname; 

关于数组类成员

JLS 10.7arrays成员

数组类型的成员是以下所有成员:

  • public final field length ,包含数组的组件数(长度可以是正数或零)
  • public method clone ,它覆盖Object类中相同名称的方法,并且不会抛出任何已检查的exception
  • 所有成员都inheritance自class Object ; 唯一没有inheritance的Object方法是它的clone方法

相关问题

  • java中的点长度 – 找到它的定义

是的,JVM中有一个合成Class ,表示每种可能类型的数组(如Integer[].class )。 每种基本类型都有一个(如int[].class )。 我不认为它有任何定义,如源文件,在任何地方。 他们表现得像预期的那样; Number[].class可以从Integer[].class Number[].class中分配。

它没有特殊的方法,如果这是你的意思,也不是任何特殊的源文件。 我甚至认为数组类型所具有的length字段也被认为是在该类中定义的,尽管我承认我没有检查; 这是VM特有的。

JLS 10.8对此进行了定义。

Java虚拟机规范在4.2节中解释了什么名称,如[Ljava.lang.String; 意思。 请参阅: 4.2完全限定类和接口名称的内部forms 。

在这种情况下, [表示这是一个数组类型,并且Lclassname; 表示这是对classname类型的对象的引用数组。

所以[Ljava.lang.String; 表示String[]