数组是一种数据结构,用来存储同一类型值的集合。数组中的每个数据被称作元素,通过一个整型下标可以访问数组中的每一个元素。例如:如果a[i]是一个整型数组,a[i]就是数组中下标为i的整数。
数组的定义
在Java中,可以使用以下格式来定义一个数组:
1 数据类型[] 数组名 = new 数据类型[元素个数或数组长度];
例如:
1 int[] x = new int[100];
上述语句就相当于在内存中定义了100个int类型的变量,第一个变量的名称为x[0],第二个变量的名称为x[1],以此类推,第100个变量的名称为x[99],这些变量的初始值都是0。为了更好地理解数组的这种定义方式,可以将上面的一句代码分成两句来写,具体如下:
1 int[] x; //声明一个int[]类型的变量 2 x = new int[100]; //创建一个长度为100的数组
注意:
声明数组的两种形式:int[] x; 或者 int x[];一般使用第一种风格,因为它将类型int[]与变量名分开了,便于理解。
创建一个byte/short/int/long数组时,所有元素都初始化为0;创建一个float/double数组时,所有元素都初始化为0.0;创建一个char数组时,所有元素都初始化为一个空字符(空格);boolean数组的元素会初始化为false;对象数组的元素则初始化为一个特殊值null,表示这些元素尚未存放任何对象。
一旦创建了数组,就不能再改变它的大小,但是可以改变每一个数组元素,如果经常需要在运行过程中扩展数组的大小,则应该使用另一种数据结构数组列表(array list)。
在Java中,为了方便我们获得数组的长度,提供了一个length属性,在程序中可以通过“数组名.length”的方式来获得数组的长度,即元素的个数。
数组的初始化
如上文所述,在定义数组时只指定数组的长度,由系统自动为元素赋初值的方式称作动态初始化。
在初始化数组时,还有另一种方式静态初始化,就是在定义数组的同时就为数组的每个元素赋值。
数组的静态初始化有两种方式:
1、类型[] 数组名 = new 类型[]{元素,元素,……};
2、类型[] 数组名 = {元素,元素,元素,……};
其中第二种方式实际上是简化书写形式,书写时通常使用第二种方式。
1 int[] x = {1,2,3,4,5};
另外还可以显示的为数组元素赋值:
1 int[] x = new int[3]; //定义一个可以存储三个元素的数组 2 x[0] = 1; //为第一个元素赋值 3 x[1] = 2; //为第二个元素赋值
此时因为只为第一个和第二个元素赋值,所以第三个元素系统默认赋值为0。
匿名数组
匿名数组是一个没有名字的数组。
1 new int[] {1,2,3,4};
表示创建一个新数组并利用括号中提供的值进行初始化数组的大小就是初始值的个数。
使用这种语法形式可以在不创建新变量的情况下重新初始化一个数组。
1 new int[] {1,2,3,4}; 2 a = new int[] {1,2,3,4};
相当于
1 int[] x = {1,2,3,4}; 2 a = x;
的简写形式。
注:在Java中,允许数组长度为0。
数组的遍历
在操作数组时,经常需要依次访问数组中的每个元素,这种操作称作数组的遍历。
第一种方式:使用普通的for循环打印元素。
1 int[] x = {1,2,3,4}; 2 for(i = 0;i < x.length;i++){ 3 System.out.println(x[i]); 4 }
第二种方式:使用for each(增强的for循环)打印元素。
1 int[] x = {1,2,3,4}; 2 for (int e:x){ 3 System.out.println(e); 4 }
第三种方式:利用Arrays类的toString方法,可以更简单的打印数组中的所有元素,返回一个包含数组元素的字符串,这些元素被放置在括号内,并用逗号分隔。
1 int[] x = {1,2,3,4}; 2 System.out.println(Arrays.toString(x));
数组拷贝
在Java中,允许将一个数组变量拷贝给另一个数组变量。此时两个变量将引用同一个数组。
1 int[] x = {1,2,3,4}; 2 int[] y = x;
拷贝后,数组变量x和y引用的是同一个数组,所以
1 y[0] = 1;
若希望将一个数组中的所有元素值拷贝到一个新的数组中去,使用Arrays类的copyOf方法:
1 int[] copyx = Arrays.copyOf(x,x.length);
第二个参数是新数组的长度,这个方法通常用来增加数组的大小。
如果新数组长度大于原数组长度,当数组元素是数值型时,多余的元素将被赋值为0;当数组元素时布尔型,多余的元素赋值为false。相反,如果新数组长度小于原数组长度时,则只拷贝最前面的而数据元素。
数组最值
在操作数组时,经常需要获取数组中元素的最值。
1 int[] x = {2,4,6,1,7,9,3}; 2 int max = x[0]; 3 for(int i = 1;i < x.length;i++){ 4 if(max < x[i]){ 5 max = x[i]; 6 } 7 } 8 System.out.println("max=" + max);
定义了一个临时变量max,用于记住数组的最大值。通过for 循环获取数组中的最大值,赋值给max变量。
数组排序
现在来做一次数组元素从小到大的排序。
冒泡排序
每相邻的两个元素做一次比较,当第一次循环执行完成后,最大的元素就被放到了最后面。
1 int[] x = {2,4,6,1,7,9,3}; 2 for(int i = 0;i < x.length - 1;i++){ 3 for(int j = 0;j < x.length - 1;j++){ 4 if(x[j] > x[j+1]){ 5 int temp = x[j]; 6 x[j] = x[j+1]; 7 x[j+1] = temp; 8 } 9 } 10 } 11 System.out.println(Arrays.toString(x));
选择排序
让数组中的每一个元素,一次与后面每个元素进行比较,当第一次循环执行完成后,最小的元素就被放到了最前面。
1 int[] x = {2,4,6,1,7,9,3}; 2 for(int i = 0;i < x.length - 1;i++){ 3 for(int j = 0;j < x.length - 1;j++){ 4 if(x[j] > x[j+1]){ 5 int temp = x[j]; 6 x[j] = x[j+1]; 7 x[j+1] = temp; 8 } 9 } 10 } 11 System.out.println(Arrays.toString(x));
此外要想对数值型数组进行排序,可以使用Arrays类的sort方法,这个方法使用了优化的快速排序算法,对于大多数的数据集合来说都是效率比较高的,有兴趣的同学可以自己去尝试一下。