一 基本特性
- 数组是对象,不属于基本数据类型,不同类型的数组具有不同的类;
- 大小不可变且存储的内存地址连续;
- 数组有一个.length的属性,String类有一个length()方法;
- 数组的equals方法是object类的equals,比较的是内存地址(并不是遍历每一个一次进行比较)。
二 数组的声明和初始化
一维和二维数组的定义
注意:通过new 关键字来数组申请空间时候行数不能为空
package test11;
public class ArrayTest {
//以为数组的合法定义
private int[] a;
private int b[];
private int []c;
//二维数组定义,(重点)一维长度必须定义,二维可以后续定义
//格式:type arrayName[][] = new type[行数][列数]
private int d[][];
private int[][] e;
private int[] f[];
private int [][]g;
private float []h[] = new float[6][6];
public static void main(String[] args) {
int[] a = new int[]{1};
double[] b = new double[]{(double)2};
System.out.println(a); //[I@14ae5a5
System.out.println(b); //[D@7f31245a
int[] i = new int[]{1,2,3};
System.out.println(i.length);
int[] j = new int[]{1,2,3};
System.out.println(i.equals(j));
}
}
通过初始化列表的方式进行初始化
package test11;
public class ArrayTest {
int a[][] = {{1},{1,2},{1,2,3}};
public static void main(String[] args) {
}
}
字节码
Java中数组是一个特殊类,通过上面的代码也可以泛型数组不是通过new 一个特定的数组类初始化的。那么数组的实例化的过程是怎么的呢?于是我尝试通过字节码找找线索。
public static void main(String[] args) {
int[] array = new int[1];
}
该方法对应的字节码,如下,关键点就是newarray 指令
,该指令就是用于数组对象,而普通的变量是通过new指令
创建对象。
JVM 规范中关于newarray 指令的说明
JVM 规范中关于new 指令的说明
0 iconst_1 #把常量1压入操作树栈,这里1声明数组的指定的长度,
1 newarray 10 (int) # 创建数组实例,10表是数组的类型为int型
3 astore_1 #被操作栈中的栈顶元素,压入本地变量表的1号位置
4 return #返回
常见面试题
补充
怎么判断当前实例是否为数组类型
最近在看源码的时候发现Class类中有一个isArray()方法用来判断是否为数组类型,特此记录一下。普通类用instanceof
关键字判断是否为某个类的实例。
public class ArrayExample {
public static void main(String[] args) {
int[] arr = new int[6];
Class<? extends int[]> aClass = arr.getClass();
boolean array = aClass.isArray();
System.out.println(array); //true
Class<ArrayExample> testClass = ArrayExample.class;
System.out.println(testClass.isArray()); //false
}
}