数组类在Java中是如何工作的?

数组类在Java中是如何工作的?,java,arrays,jvm,Java,Arrays,Jvm,在Java中,数组是一个类,它扩展了对象。我很想知道这个特殊的数组类。我在任何地方都找不到类定义。执行getClass().getName()会产生奇怪的结果 String[] array = new String[]{"one","two"}; System.out.println(array.getClass().getName()); // prints [Ljava.lang.String; 我想了解阵列在引擎盖下是如何工作的。数组类定义是否在JVM中硬编码 任何关于这方面的资源、书籍

在Java中,数组是一个类,它扩展了对象。我很想知道这个特殊的数组类。我在任何地方都找不到类定义。执行getClass().getName()会产生奇怪的结果

String[] array = new String[]{"one","two"};
System.out.println(array.getClass().getName()); // prints [Ljava.lang.String;
我想了解阵列在引擎盖下是如何工作的。数组类定义是否在JVM中硬编码

任何关于这方面的资源、书籍和链接都会很有帮助


谢谢。

是的,基本上,数组是VM非常了解的东西,就像基本类型一样。有一些特定的字节码指令可用于处理数组——创建数组、索引数组等等


至于了解更多信息的资源,这可能是最好的起点。第7.9节有一些字节码处理数组的示例。

是的,JVM中有一个合成的
,表示每种可能类型的数组(如
Integer[].Class
)。每个基元类型也有一个(如
int[].class
)。我不认为它是有定义的东西,就像源文件一样。他们的行为有点出乎意料<代码>数字[]。类可以从
整数[]赋值。例如,类

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


定义它。

Java虚拟机规范在第4.2节中解释了
[Ljava.lang.String;
等名称的含义。请参阅:

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

因此
[Ljava.lang.String;
表示数组类名称的
String[]

明确指定这些“时髦”数组名称:

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

如果该类对象表示基元类型或void,则返回的名称是一个
字符串
,等于与基元类型或
void
对应的Java语言关键字

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

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

关于数组类成员 数组类型的成员包括以下所有成员:

  • 公共最终字段长度
    ,其中包含数组的组件数(长度可以为正或零)
  • 公共方法克隆
    ,它覆盖类
    对象
    中同名的方法,并且不抛出任何选中的异常
  • 继承自
    类对象的所有成员
    ;未继承的
    对象的唯一方法是其
    克隆
    方法
相关问题