JVM处理java数组的方法

来源:互联网 发布:c js混淆工具 编辑:程序博客网 时间:2024/05/18 08:16

一丶什么是数组

在我印象中的数组一般都是 int[] a = new int[4]; 通过new关键字创建并组装他们,然后通过整数索引值来访问其中的元素。 后来我又明白 数组是一个特殊的对象,在《java编程思想》中说 “数组是一种效率最高的存储和随机访问对象引用序列的方式。数组就是一个简单的线性序列,这使得元素访问非常快速。但是这种速度所付出的代价是数组对象的大小被固定,并且在其生命周期中不可改变”

二丶数组对象的类是什么?

public static void main(String[] args) {int a[][] = new int[10][10];Class clazz = a.getClass();System.out.println(clazz.getName());}

在jdk1.7中输出的是 [I

这个输出不属于任何包,而且名称还不是合法的标识 ('['的数目代表了数组的维度,后面的是数组中存放的元素类型)

三丶数组的类有哪些成员呢?

既然数组是个类 类中就可能存在成员方法或者成员变量等等一系列类中应该有的东西。 这一切我们都可以用java的反射性质一探究竟。

public static void main(String[] args) {int[] a = new int[3];Class clazz = a.getClass();System.out.println(clazz.getName());System.out.println(clazz.getDeclaredFields().length);  //类中字段的个数System.out.println(clazz.getDeclaredMethods().length);  //类中方法的个数System.out.println(clazz.getDeclaredConstructors().length);  //类中构造方法的个数System.out.println(clazz.getDeclaredAnnotations().length);   //类中的注解System.out.println(clazz.getDeclaredClasses().length);  System.out.println(clazz.getSuperclass());}

输出:[I 0 0 0 0 0 class java.lang.Object

[I 就是一个空类,连length这个成员变量都没有,但是你在使用的过程能用length这个成员变量呢。

四丶数组的类在哪里声明的?

让我们先看看字节码

public static void main(String[] args) { int a[] = new int[2]; int i = a.length;   }
iconst_2                   //将int型常量2压入操作数栈  newarray 10 (int)          //将2弹出操作数栈,作为长度,创建一个元素类型为int, 维度为1的数组,并将数组的引用压入操作数栈  astore_1                 //将数组的引用从操作数栈中弹出,保存在索引为1的局部变量(即a)中  aload_1                    //将索引为1的局部变量(即a)压入操作数栈  arraylength               //从操作数栈弹出数组引用(即a),并获取其长度(JVM负责实现如何获取),并将长度压入操作数栈  istore_2                 //将数组长度从操作数栈弹出,保存在索引为2的局部变量(即i)中  return                  //main方法返回

通过这段字节码,根本就没有看见length这个成员变量,获取数组长度的只能是一条arraylength实现,是由jvm底层实现,和我们没有什么关系。编译器对Array.length()这样的语法做了特殊处理,直接编译成了arraylength指令。另外,JVM创建数组类,应该就是由newarray这条指令触发的了。

参考:http://developer.51cto.com/art/201001/176671.htm

原创粉丝点击