0%

数组的初始化

摘要:
数组的几种初始化方式,非基本数据类型数组的初始化写法,以及多维数组的写法。(P116


两种定义方式:

1
2
int a[];
int[] a;//java推荐写法

数组的大小可随机决定,因为数组的创建实际是在运行期间进行的,并且基本数据类型会自动初始化。

1
2
3
4
5
6
7
8
9
10
11
import java.util.Random;
public class TestArray {
static Random rand = new Random();
static int prand(int mod){
return Math.abs(rand.nextInt())%mod + 1;
}
public static void main(String[] args){
int[] arr = new int[prand(10)];
int[][][] b = new int[prand(10)][][];
}
}

非基本数据类型数组的初始化:

1
2
3
4
5
6
7
8
9
10
11
12
//java 1.0
Integer[] c1 = {
new Integer(1),
new Integer(2),
new Integer(3),//最后这个逗号是可选的,(这一特性是长列表的维护变得更加容易)
};
//java 1.1
Integer[] c2 = new Integer[]{
new Integer(1),
new Integer(2),
new Integer(3),
};

下面的形式(java 1.1开始支持)提供了一种更简便的语法,可创建和调用方法,获得与C的“可变参数列表”一样的效果。这种效果包括未知的参数(自变量)数量和未知的类型(如果这样选择的话)。由于所有类最终都是从通用的根类Object中继承的,所以能创建一个方法,令其获取一个Object数组,并像下面这样调用它:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class A{ int i; }
public class Varargs {
static void f(Object[] x){
for(int i=0; i<x.length; i++){
System.out.println(x[i]);
}
}
public static void main(String[] args){
f(new Object[]{
new Integer(47), new Varargs(), new Float(3.14), new Double(11.11)
});
f(new Object[]{
"one", "two", "three"
});
f(new Object[]{
new A(), new A(), new A() //第一个输出: pers.wxy.hello.test.A@12edcd21
});
}
}

多维数组

下面这个例子揭示出构成矩阵的每个矢量都是可以有任意长度的:

1
2
3
4
5
6
7
int[][][] a = new int[prand(10)][][];
for(int i=0; i<a.length; i++){
a[i] = new int[prand(10)][];
for(int j=0; j<a[i].length; j++){
a[i][j] = new int[prand(10)];
}
}

P.S.
java会检查每个数组的访问,方法是一旦超过边界,就生成一个运行期错误(“违例”)。这会消耗一定的时间和多余的代码量,而且没有办法关闭。这是数组访问在某些关键场合成为程序效率低下的重要原因,但考虑到英特网访问的安全和编程效率,这是值得的。