目录
一、数组
1.1 数组的概念
数组可以看成是相同类型元素的一个集合,在内存中是一段连续的空间,每个空间都有自己的编号,起始位置的编号是0,即数组的下标。
1.2 数组的初始化
数组的初始化主要分为动态初始化以及静态初始化。如果没有对数组进行初始化,数组中元素有默认值,默认值为基类类型对应的默认值,例如:int[]的默认值为0。
动态初始化:在创建数组时,直接指定数组中元素的个数。
int[] array = new int[5];//默认初始化为0
静态初始化:在创建数组时不直接指定数据元素个数,而直接将具体的数据内容进行指定。
int[] array1 = {1,2,3,4,5};
int[] array2 = new int[]{1,2,3,4,5};
简而言之,动态初始化指定长度,静态初始化指定内容。
1.3 数组的使用
1.3.1 数组的访问
由于数组在内存中是一段连续的空间,空间的编号(数组的下标)都是从0开始的,依次递增,所以数组支持随机访问,即可以通过下标快速访问数组中任意位置的元素。
例如,访问array数组中的下标为0的元素10,代码如下:
public static void main(String[] args) {
int[] array = new int[]{10, 20, 30};
System.out.println(array[0]);//输出为 10
}
1.3.2 数组的遍历
遍历是指将数组中的所有元素都访问一遍, 访问是指对数组中的元素进行某种操作。
例如,通过循环打印,代码如下:
public static void main(String[] args) {
int[] array = {1,2,3,4,5};
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");//输出为 1 2 3 4 5
}
}
注:在数组中可以通过数组对象.length来获取数组的长度。
同时,也可以使用 for-each 遍历数组,例如:
public static void main(String[] args) {
int[] array = {1,2,3,4,5};
for (int x : array) {
System.out.print(x + " ");//输出为 1 2 3 4 5
}
}
注:for-each 循环括号中 x 是与数组元素对应的数据类型所定义的变量,array 为数组名,其原理是将 array 中元素都放入 x,再进行输出即可。
二者的区别:普通for循环可获取数组元素下标,for-each循环则无法获得。
二、有关数组操作的方法
2.1 数组转字符串
上文中提到了两种遍历输出,当然,还有最为方便的一种输出,利用操作数组的工具类 Arrays 中的 toString 方法,该方法是将数组转化为字符串进行输出,例如:
import java.util.Arrays;
public static void main(String[] args) {
int[] array = {1,2,3,4,5};
String x = Arrays.toString(array);
System.out.println(x);//输出为 [1, 2, 3, 4, 5]
}
既然我们可以使用toString方法让数组更方便地输出,那我们也可以尝试自行实现 Arrays.toString方法,代码如下:
public static void main(String[] args) {
int[] array = {1,2,3,4,5};
String arr = myToString(array);
System.out.println(arr);//输出为 [1,2,3,4,5]
}
public static String myToString(int[] array) {
//若数组初始值为null,则会显示空指针异常
if (array == null) {
return "null";
}
String arr = "[";
for (int i = 0; i < array.length; i++) {
arr += array[i];
if (i != array.length-1) {
arr += ",";
}
}
arr += "]";
return arr;
}
2.2 数组的拷贝
数组的拷贝同样是对数组进行操作,那我们也同样可以使用 Arrays 中的 copyOf 方法,copyOf 方法在进行数组拷贝时,创建了一个新的数组,例如:
public static void main(String[] args) {
int[] array = {1,2,3,4,5};
//拷贝 array 这个数组,长度为 array.length
int[] copy = Arrays.copyOf(array, array.length);
System.out.println(Arrays.toString(copy));//输出为 [1, 2, 3, 4, 5]
}
Arrays.copyOf 方法还能对数组长度进行扩容,例如:
public static void main(String[] args) {
int[] array = {1,2,3,4,5};
//拷贝 array 这个数组,长度为 array.length*2
array = Arrays.copyOf(array, array.length*2);
//array 指向了新的数组空间,长度扩大为原来的 2 倍
System.out.println(Arrays.toString(array));//输出为 [1, 2, 3, 4, 5, 0, 0, 0, 0, 0]
}
我们还可以利用 Array.copyOfRange 方法对数组进行局部拷贝,需要注意的是,局部拷贝中下标的范围区间采用的是左闭右开,例如:
public static void main(String[] args) {
int[] array = {1,2,3,4,5};
//拷贝 array 数组中区间为 [1,3)的元素
int[] copy = Arrays.copyOfRange(array,1,3);
System.out.println(Arrays.toString(copy));//输出 [2, 3]
}
还有最为灵活的 System.arraycopy 方法,可以从源数组的某个位置的元素拷贝到另一个数组的某一个位置,例如:
public static void main(String[] args) {
int[] array = {1,2,3,4,5};
int[] copy = new int[array.length];
//(源数组,拷贝起始下标,目的数组,目的下标,拷贝长度)
System.arraycopy(array,0,copy,0,array.length);
System.out.println(Arrays.toString(copy));//输出为 [1, 2, 3, 4, 5]
}
2.3 数组的排序
我们可以利用 Arrays.sort 方法将数组中的乱序元素变为有序元素,例如:
public static void main(String[] args) {
int[] array = {1,0,0,8,6};
Arrays.sort(array);
System.out.println(Arrays.toString(array));//输出为 [0, 0, 1, 6, 8]
}
三、二维数组
3.1 二维数组的初始化
二维数组本质上也是一维数组,只不过每个元素又是一个一维数组,所以二维数组的初始化与一维数组类似,例如:
//两行三列数组
int[][] array1 = {{1, 2, 3}, {4, 5, 6}};
int[][] array2 = new int[][]{{1,2,3},{4,5,6}};
int[][] array3 = new int[2][3];//默认初始化为0
注:Java中二维数组的定义可以省略列。
3.2 二维数组的遍历
二维数组中元素的个数是行数,即 array.length,列数为每个元素中的元素个数,即 array[i].length,遍历二维数组代码如下:
public static void main(String[] args) {
int[][] array = {{1, 2, 3}, {4, 5, 6}};
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
System.out.print(array[i][j] + " ");//输出为 1 2 3
// 4 5 6
}
System.out.println();
}
}
利用 for-each 遍历时,若只使用一次 for-each,获得的只是二维数组中元素的地址,所以需要两层 for-each 来遍历二维数组元素中的元素,例如:
public static void main(String[] args) {
int[][] array = {{1, 2, 3}, {4, 5, 6}};
for (int[] x : array) {
for (int y : x) {
System.out.print(y + " ");// 1 2 3
//4 5 6
}
System.out.println();
}
}
与 for-each 同理,普通的 Arrays.toString 无法获得二维数组深层元素,所以我们需要使用Arrays.deepToString 方法来输出二维数组,例如:
public static void main(String[] args) {
int[][] array = {{1, 2, 3}, {4, 5, 6}};
String ret = Arrays.deepToString(array);
System.out.println(ret);//输出为 [[1, 2, 3], [4, 5, 6]]
}
总结
1、在数组中可以通过数组对象.length来获取数组的长度。
2、可以使用 Arrays.toString 方法将数组转为字符串输出。
3、利用 Arrays.copyOf 方法可以对数组进行拷贝或长度的扩容。
4、Arrays.sort方法可以将数组元素快速有序排列。
5、Java中二维数组的定义可以省略列。