数组能够顺序存储相同类型的多个数据。除了存储数据,我们也希望能够访问数据。访问数组中的某个元素的方法是将其编号然后索引。如果我们有N个值,它们的编号则为0至N-1。这样对于0到N-1之间任意的i,我们就能够在Java代码中用a[i]唯一地表示第i 个元索的值。在Java中这种数组被称为一维数组。
在Java程序中创建一个数组需要 三步:
1.声明数组的名字和类型;
2.创建数组;
3.初始化数组元素。
在声明数组时,需要指定数组的名称和它含有的数据的类型。在创建数组时,需要指定数组的长度(元素的个数)。例如,在以下代码中,“完整模式”部分创建了个有N个元素的double数组,所有的元素的初始值都是0.0。第一条语句是数组的声明,它和声明一个相应类型的原始数据类型变量十分相似,只有类型名之后的方括号说明我们声明的是一个数组。第二条语句中的关键字new使Java创建了这个数组。我们需要在运行时明确地创建数组的原因是Java编译器在编译时无法知道应该为数组预留多少空间(对于原始类型则可以)。for语句初始化了数组的N个元素,将它们的值置为0.0。在代码中使用数组时,一定要依次声明、创建并初始化数组。忽略了其中的任何一步都是很常见的编程错误。
//完整模式
double[] a;//声明数组
a = new double[N] ; //创建数组
for (int i=0; 1 <N; i++)
a[i] = 0.0;//初始化数组
//简化写法:
double[] a = new double[N];
//声明初始化:
int[]a={1,1,2,3,5,8};
为了精简代码,我们常常会利用Java对数组默认的初始化来将三个步骤合为一条语句, 即上例中的简化写法。等号的左侧声明了数组,等号的右侧创建了数组。这种写法不需要for循环,因为在一个Java数组中double类型的变量的默认初始值都是0.0,但如果你想使用不同的初始值,那[8]么就需要使用for循环了。数值类型的默认初始值是0,布尔型的默认初始值是false。 例子中的第三种方式用花括号将一列由逗号分隔的值在编译时将数组初始化。
典型的数组处理代码请见下表在声明并创建数组之后,在代码的任何地方都能通过数组名之后的方括号中的索引来访问其中的元素。数组一经创建, 它的大小就是固定的。程序能够通过a. length获取数组a[]的长度,而它的最后一个元素总是a[a.1ength - 1]。 Java 会自动进行边界检查一如果你创建了一个大小为N的数组,但使用了一个小于0或者大于N-1的索引访问它,程序会因为运行时抛出ArrayOutOfBoundsException异常而终止。
任务 | 实现(代码片段) |
---|---|
找出数组中最大的元素 | doube max=a[0]; for(int i=0; i<a.length; i++){ if (a[i] > max) max=a[i]; } |
计算数组元素的平均值 | int N=a. length; double sum=0.0; for (int i =0: i <N; i++){ sum+=a[i]; double average = sum / N; } |
复制数组 | int N=a. length; double[] b= new double[N]; for (int i =0: i <N; i++){ b[i]=a[i]; } |
颠倒数组元素的顺序 | int N=a. length; for (int i =0: i <N/2; i++){ double temp=a[i]; a[i] = a[N-i-1] ; a[N-i-1] = temp; } |
矩阵相乘 a[] [] * b[] []=c[] [] | int N=a. length; double[][] [] [] c=new double[N]; for (int i =0: i <N; i++){ for(int j=0;j<N; j++){ for Cint k=0;k<N; k++) c[i] [j] += a[i] [k]*b[k] [j]; |
请注意,数组名表示的是整个数组——如果我们将 -个数组变量赋予另-一个变量, 那么两个变量将会指向同一个数组。例如以下这段代码:
int[] a= new int[N];
a[i] = 1234;
int] b= a;
b[i]= 5678; // a[i]的值也会变成5678
这种情况叫做起别名,有时可能会导致难以察觉的问题。如果你是想将数组复制一份, 那么应该声明、创建并初始化一个新的数组,然后将原数组中的元素值挨个复制到新数组。
在Java中二维数组就是一维数组的数组。二维数组可以是参差不齐的(元素数组的长度可以不致),但大多数情况下(根据合适的参数M和N)我们都会使用M*N,即M行长度为N的数组的二维数组(也可以称数组含有N列)。在lava中访向二维数组也很简单。二维数组a[] []的第i行第j列的元素可以写作a[i] [j]。声明二维数组需要两对方括号。创建二维 数组时要在类型名之后分别在方括号中指定行数以及列数,例如:
double[] [] a = new double[M] [N];
我们将这样的数组称为M*N的数组。我们约定,第一维是行数,第二维是列数。和一维数组一样,Java会将数值类型的数组元素初始化为0,将布尔型的数组元素初始化为false。默认的初始化对二维数组更有用,因为可以节约更多的代码。下面这段代码和刚才只用一行就完成创建 和初始化的语句是等价的:
double[][] a;
a = new double[M] [N];
for (int j=0; j <N; j++)
a[i] [j]=0.0;
在将二维数组初始化为0时这段代码是多余的,但是如果想要初始化为其他值,我们就需要嵌套的for循环了。