参考自《Java编程思想 第4版》(Thinking in Java):Java提供了一系列的容器来供我们容纳和操作对象。
数组代表一系列对象或基本类型,所有所有相同的类型都封装到一起——采用一个统一的标识符名称。数组的定义和使用是通过方括号索引运算符进行的([])
int[] a1;
也可以采用下面的方法:
int a2[];
数组和其他集合的区别在于:效率和类型。对于Java,保存和访问一系列对象的最有效方法可以说是数组。因为数组代表的是一个简单的线性序列,所以相对于其他集合,数组的访问速度特别快,但是代价却是数组的大小是固定的。
- 数组初始化
public static void main(String[] args) { // 直接赋值 int a1[] = {1,2,3,4,5}; int a2[]; a2 = a1; for(int i = 0; i < a1.length; i++) { a2[i]++; } for(int i = 0; i < a1.length; i++) { System.out.println("a1[" + i + "] = " + a1[i]); } }
输出结果:a1[0] = 2 a1[1] = 3 a1[2] = 4 a1[3] = 5 a1[4] = 6
我们看到虽然改变的是a2中的值,但是输出的a1数组中的值却发生了改变。这是因为我们执行 a2 = a1; 这段代码时,只是将a1所指向的数组对象的地址传递给了a2,而不是a1的内容。
在程序编写期间,如果我们不知道自己需要多大的数组,可以采用 new 这一关键词进行数组的创建。public static void main(String[] args) { testArray(); } public static void testArray() { // 声明数组 int a[]; // 随机生成一个数,模拟未知的数组大小 int length = (int) (Math.random() * 10); a = new int[length]; System.out.println("length = " + length); for(int i = 0; i < length; i++ ) { System.out.println("a1[" + i + "] = " + a[i]); } }
结果:我们发现输出的结果中为0,这是因为在新创建的时候,基本数据类型的数组元素会自动初始化成“空”值(对于数值,空值就是零;对于 char,它是null;// 每次执行的结果不一样,因为大小是随机数产生的 length = 7 a1[0] = 0 a1[1] = 0 a1[2] = 0 a1[3] = 0 a1[4] = 0 a1[5] = 0 a1[6] = 0
而对于boolean,它却是 false)。当然,数组可能已在相同的语句中定义和初始化了,如下所示:
int[] a = new int[20];
- 多维数组
在Java里可以很方便的创建多维数组:
public class MultiDimArray { static Random rand = new Random(); static int pRand(int mod) { return Math.abs(rand.nextInt()) % mod + 1; } public static void main(String[] args) { // 二维数组 int[][] a1 = { { 1, 2, 3, }, { 4, 5, 6, }, }; for(int i = 0; i < a1.length; i++) for(int j = 0; j < a1[i].length; j++) prt("a1[" + i + "][" + j +"] = " + a1[i][j]); // 三维数组,固定大小 int[][][] a2 = new int[2][2][4]; for(int i = 0; i < a2.length; i++) for(int j = 0; j < a2[i].length; j++) for(int k = 0; k < a2[i][j].length; k++) prt("a2[" + i + "][" +j + "][" + k +"] = " + a2[i][j][k]); // 三维数组,动态指定大小 int[][][] a3 = new int[pRand(7)][][]; for(int i = 0; i < a3.length; i++) { a3[i] = new int[pRand(5)][]; for(int j = 0; j < a3[i].length; j++) a3[i][j] = new int[pRand(5)]; } for(int i = 0; i < a3.length; i++) for(int j = 0; j < a3[i].length; j++) for(int k = 0; k < a3[i][j].length; k++) prt("a3[" + i + "][" + j + "][" + k + "] = " + a3[i][j][k]); // Array of non-primitive objects: Integer[][] a4 = { { new Integer(1), new Integer(2)}, { new Integer(3), new Integer(4)}, { new Integer(5), new Integer(6)}, }; for(int i = 0; i < a4.length; i++) for(int j = 0; j < a4[i].length; j++) prt("a4[" + i + "][" + j + "] = " + a4[i][j]); Integer[][] a5; a5 = new Integer[3][]; for(int i = 0; i < a5.length; i++) { a5[i] = new Integer[3]; for(int j = 0; j < a5[i].length; j++) a5[i][j] = new Integer(i*j); } for(int i = 0; i < a5.length; i++) for(int j = 0; j < a5[i].length; j++) prt("a5[" + i + "][" + j + "] = " + a5[i][j]); } static void prt(String s) { System.out.println(s); } }