数组类如何在Java中工作?

时间:2010-05-26 07:09:30

标签: java arrays jvm

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

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

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

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

谢谢。

4 个答案:

答案 0 :(得分:7)

是的,基本上数组是VM非常熟悉的东西,比如原始类型。有特定的字节码指令可以处理数组 - 创建它们,索引它们等等。

至于要了解更多信息的资源 - JVM specification可能是最好的起点。第7.9节有一些使用数组的字节码的例子。

答案 1 :(得分:6)

关于数组类名

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

  

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

     

如果此类对象表示基本类型或void,则返回的名称是String,等于与基元类型或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;

关于数组类成员

JLS 10.7 Array members

  

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

     
      
  • public final field length,其中包含数组的组件数(长度可能为正数或零)
  •   
  • public method clone,它会覆盖类Object中同名的方法,并且不会抛出任何已检查的异常
  •   
  • 所有成员都继承自class Object; Object方法
  • 是唯一未被继承的clone方法   

相关问题

答案 2 :(得分:1)

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

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

JLS 10.8定义了这一点。

答案 3 :(得分:1)

Java虚拟机规范在4.2节中解释了诸如[Ljava.lang.String;之类的名称。请参阅:4.2 The Internal Form of Fully Qualified Class and Interface Names

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

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