Java中有许多基本类型,而数组是一种更复杂的复合类型。本文简单讲解Java中数组的声明、创建、排序、查找、判断相等和填充等内容。
数组是存储相同类型变量的集合。
一维数组
- 声明
使用数组前必须对声明一个数组变量,并指明数组的元素类型,例如
double[] a;
int[] b;
第一行声明了一个double
类型的数组变量a
,表示对这个数组的引用;第二行声明了一个int
类型的数组变量b
。
声明数组也可使用C\C++的风格形式,如
double a[];
int b[];
但是,更推荐第一种写法。
- 创建
声明数组变量仅仅是创建了一个对数组的引用的存储位置,并没有在内存中分配存储空间,这一点与基本数据类型不同。
如果声明的变量不对数据进行引用,则变量值为null
。可用new
操作符创建数组,并将数组的引用赋值给一个变量,例如
a = new double[10];
使用new
操作符创建了一个大小为10的double
类型数组,并将其赋值给了变量a
。
数组变量的声明、数组创建和赋值可写为一条语句,例如
double[] a = new double[10];
- 数组的大小
在数组创建时指定了大小,内存为其分配了存储空间。数组大小在创建之后就不能修改。可用length
获取数组的大小,如
int len = a.length;
a.length
获取了数组a
的大小。
- 数组的默认值
在数组创建之后,数组中的元素就赋予了默认值,如果是数值型数组,则元素默认值为0;如果是char
型,默认值为\u0000
;如果是boolean
型,默认值为false
。
- 访问数组元素
数组元素通过下标的形式访问。数组的下标是从0开始,下标最大为a.length-1
。也就是说,a[0]
是数组a
的第一个元素,而a[9]
是最后一个元素。获取数组元素之后,就可把它当作基本变量进行操作。
- 初始化
在创建数组后,可访问数组中各个元素,对其赋初值的方式进行初始化,如
double[] a = new double[3];
a[0] = 2.3;
a[1] = 5.5;
a[2] = 4.5;
还可将声明、创建和初始化放在一条语句中,如
double[] a = {2.3, 5.5, 4.5};
上述语句不能拆成声明和赋值两条语句,否则错误。
foreach
循环
foreach
循环可看作for
循环的缩减形式,并且可以不使用下标而顺序地访问数组元素,如
for (double e: a)
System.out.println(e);
上述语句是打印数组a
中每个元素e
的值。
- 复制数组
如果需要将数组a
复制给数组b
,需要将数组a
中每个元素都复制数组b
中,而不能使用数组变量赋值的形式,如
b = a;
这个写法不能完成数组的复制。这是因为a
和b
表示的是两个数组的地址,当使用复制语句之后,a
和b
将指向同一个地址空间。
此外,还可使用System
中的静态方法arraycopy
完成数组复制
System.arraycopy(sourceArray, srcPos, targetArray, tarPos, length);
其中,参数Pos
和tarPos
分别表示源数组sourceArray
和目标数组targetArray
中的开始位置,参数length
指定需要复制的元素个数。
使用该方法前,需要创建目标数组分配存储空间。
- 数组排序
java.util.Arrays
类中包含了sort
和parallelSort
方法,可对数组的全部进行排序,如
java.util.Arrays.sort(a);
java.util.Arrays.parallelSort(a);
也可对数组部分进行排序,如
java.util.Arrays.sort(a, 1, 7);
java.util.Arrays.parallelSort(a, 1, 7);
表示对a[1]
到a[7 - 1]
的范围进行排序。
当电脑有多个处理器时,
parallelSort()
方法更加高效。
- 二分查找
java.util.Arrays
类中还有二分查找binarySearch()
方法,使用该方法的前提是数组必须已经按升序的顺序排列好,如
java.util.Arrays.binarySearch(a, 2.3);
表示在数组a
中查找值为2.3的元素,如果该元素存在,则返回该元素在数组中的下标;如果不存在,则返回-1。
- 判断相等
java.util.Arrays
类中提供了equals()
方法判断两个数组是否相等,如
java.util.Arrays.equals(a, b);
上述代码判断数组a
和b
是否相等,相等返回true;否则返回false。
- 填充
java.util.Arrays
类中提供fill()
方法对数组的全部或部分进行填充,如
java.util.Arrays.fill(a, 5);
表示把5赋值给数组a
中的每一个元素,而
java.util.Arrays.fill(a, 1, 7, 5);
表示把5赋值给a[1]
到a[7 - 1]
中的每一个元素。
- 返回字符串
java.util.Arrays
类中提供了toString()
方法返回字符串,代表数组中的所有元素,如
java.util.Arrays.toString(a);
二维数组
二维数组可以看成一维数组的数组,二维数组的每个元素都是一维数组。
- 声明和创建
二维数组使用两个下标,分别表示行和列,与一维数组一样,都是从0开始。二维数组声明如下
int[][] matrix;
也可用下面这种方式,但是不推荐
int matrix[][];
同样使用new
操作符进行创建,如
matrix = new int[3][3];
二维数组通过行和列下标进行访问,利用下标方式进行初始化,如
matrix[0][0] = 2;
matrix[2][1] = 1;
也可使用下面这种方式对数组进行声明、创建和初始化
int[][] matrix = {{1, 2, 3}, {2, 3, 4}, {5, 6, 7}};
- 长度
二维数组实际上是数组的数组,二维数组的元素就是一维数组。因此,matrix.length
就是二维数组的元素个数,也即行数。而matrix[0].length
、matrix[1].length
等分别表示第0个和第1个一维数组元素的个数。
- 锯齿数组
二维数组是一维数组的数组,因此,每个一维数组的长度可能不同,如
int[][] matrix = {{1, 2, 3}, {1, 2}, {1}};
matrix
中第1个元素的长度matrix[0].length
为3;而第2个元素和第3个元素分别为2和1。这样各行长度不同的数组称为锯齿数组。
当第2维长度不确定时,在数组声明时可以空缺第2维长度值,如
int[][] matrix = new matrix[3][];
new
后面必须指定第一个下标值,不允许两个下标值都空缺。