写在前面
不知道你想过没有,我们常说数组也是对象,既然是对象,肯定要有一个类名称了,那么,数组的类名称是什么呢?数组相关的操作对应的指令又是什么呢?本文就一起来看下。
1:叨叨叨
对于普通的类,都有对应的Class字节码文件,并且都有自己唯一的全限定类名称,但是数组不同,它并没有对的Class字节码文件,也没有明确的类名称。所以创建数组的对象和创建创建普通对象还是有所不同的,为了更好的处理这些不同
jvm针对数组定义了专门的一组指令,如下:
newarray:创建基础数据类型数组
anewarray:创建对象类型数组
<t>astore:这里的<t>是代表类型,如iastore是将栈顶的int类型数据存储到指定数组的指定位置,fastore是将栈顶的float类型数据存储到指定数组的指定位置
<t>aload:这里的<t>是代表类型,如iaload是从int类型的数组中的指定位置获取元素并推送到栈顶,faload是从float类型数组的指定位置获取元素并推送到栈顶
multianewarray:创建多维数组
arraylength:获取数组长度并存储到栈顶
如下通过javap -v xxx.class
查看字节码指令:
关于数组的类名称是这样的,类名的规则是([)+
组合类型的描述符
,比如一维的int数组就是[I
,一维的布尔数组就是[Z
,一维的long数组就是[J
,具体如下代码:
对象类型是这样子的,一维String数组就是[Ljava/lang/String;
,Object[]的类名是[Ljava/lang/Object;
。如下测试代码:
public class AAA {public static void main(String[] args) {System.out.println(new int[3].getClass().getName());System.out.println(new int[8][3].getClass().getName());System.out.println(new String[3].getClass().getName());System.out.println(new Object[3].getClass().getName());System.out.println(new boolean[3].getClass().getName());System.out.println(new long[3].getClass().getName());}
}
运行:
写在后面
参考文章列表
JVM 虚拟机字节码指令表 。