注:本文是对《疯狂Java面试讲义》的小结。
数组的创建和初始化
- 方式1(动态初始化):
int[] arr1 = new int[3];
注意:动态初始化所创建的数组,其元素都有初始值(0、false、null等)。
- 方式2(静态初始化):
int[] arr2 = new int[] {
111, 222, 333};
- 方式2的变形:
int[] arr2 = {
111, 222, 333};
方式1和方式2不能混用。
创建数组对象时,必须指定长度,可以显式(方式1)或隐式(方式2)指定。
// 创建数组对象时,必须指定长度
int[] arr1 = new int[]; // 编译错误
数组对象创建后,其内存空间和数组长度都是不可变的(JavaScript的数组长度是动态可变的)。
使用 arr1.length
来获取数组长度(注意不要加括号)。
数组的长度可以是0:
int[] arr1 = new int[0];
int[] arr2 = new int[] {
};
数组可以为空:
int[] arr1 = null;
我们知道,Java对象是引用类型。 new
所创建的对象是在内存堆里创建的。数组对象也是 new
出来的,和其它Java对象并无本质区别。比如:
arr1 = new int[3]; // arr1引用一个数组对象
arr1 = new int[4]; // arr1引用另一个数组对象
arr2 = arr1; // arr2和arr1指向同一个数组对象
Arrays类
可用 Arrays
类来操作数组,比如:
Arrays.sort(arr1)
:排序Arrays.stream(arr1)
:获取流Arrays.asList(arr1)
:把数组转换为List,反过来是list.toArray()
Arrays.toString(arr1)
:把数组转换为一个字符串,方便打印,比如[1, 2, 3, 4, 5]
Arrays.fill(arr1, 8)
:把数组里的每个元素都赋值
多维数组
多维数组的本质是一维数组,其中的每个元素又是一个数组。
也就是说,有1个高维数组对象,和N个低维数组对象。
比如:
int[][] arr3 = new int[3][5];
arr3
是一个长度为3的数组,其中每个元素是一个长度为5的数组。
System.out.println(arr3.length); // 3
System.out.println(arr3[0].length); // 5
注意,高维在左边,低维在右边。
对于多维数组中的高维来说,数组中每个元素又是一个数组(低维数组),每个低维数组的长度可以各不相同(甚至可以不初始化)。
看下面多维数组的例子:
- 例1:
int[][] arr4 = new int[3][5]; // 高维数组的长度为3,低维数组的长度为5
arr4[2] = new int[6]; // 只要高维数组的每个元素是int[]就OK,长度不限
- 例2:
int[][] arr5 = new int[3][]; //高维数组的长度为3,低维数组对象并没有被创建
arr5[0] = new int[5]; //创建低维数组对象
arr5[1] = new int[6]; //创建低维数组对象
- 例3:
// 高维数组的长度为2,低维数组的长度为3和4
int[][] arr6 = new int[][] {
{
111, 222, 333}, {
444, 555, 666, 777}};
- 例4:
// 高维数组的长度为2,低维数组的长度为0
int[][] arr7 = new int[][] {
{
}, {
}};
- 例5:
// 高维数组的长度为3,前两个低维数组为空,最后一个低维数组长度为0
int[][] arr8 = new int[][] {
null, null, {
}};
下面是一些错误的例子:
- 例1:
// 创建数组对象时,必须指定长度
// (对于多维数组,只需指定最高维的长度,低维数组对象是高维数组的元素,可以先不创建)
int[][] arr9 = new int[][]; // 编译错误
- 例2:
// 创建数组对象时,必须指定长度
int[][] arr10 = new int[][2]; // 编译错误
- 例3:
// 两种初始化方式不能混用
int[][] arr11 = new int[2][3] {
{
111, 222, 333}, {
444, 555, 666}}; // 编译错误