Java数组
2021/3/20 周六
复习内容: 数组的声明和初始化、数组的长度、数组访问、java.lang.ArrayIndexOutOfBoundsException数组下标越界异常、二维数组、java.lang.NullPointerException空指针异常
如有错误,欢迎在评论区指出,非常感谢!
数组是一种类型(与基础数据类型不一样),它能一次性定义多个同类型的变量,存放多个同类型数据。
一、声明数组
// 数据类型[] 数组名;
int[] arr;
// 数据类型 数组名[];
int arr[];
数据类型就是数组里存储元素的类型,[]代表数组,千万不要写漏。
以上两种方式都可以用来声明数组,但是一般建议使用第一种。
此时只是声明了数组,数组变量还没有被初始化。注意,在声明时不要规定数组的长度。
二、数组初始化
1. 动态初始化-只确定长度
// 数据类型 []数组名 = new 数据类型[数组长度];
int[] arr = new int[20];
或者如果数组brr已经被定义了,直接将等号后面new的数组变量赋值给brr也可以
int[] brr;
brr = new int[20]; // 这样也可以
此方式创建数组对象时,只需要指定数组的长度,数组中所有的元素的值默认为"零",具体各数据类型的"零"值为:
数据类型 | “零” |
---|---|
byte short int long | 0 |
float double | 0.0 |
boolean | false |
char | ’ '(空格) |
引用数据类型 | null |
注意此方式创建数组对象必须使用 new 关键字,且 = 前后数据类型一致
2. 动态初始化-确定长度和内容
// 数据类型 []数组名 = new 数据类型[]{v1,v2,v3,v4,...};
int[] arr = new int[]{v1,v2,v3,v4,...};
此方式创建数组时,数组中的元素值也依次为{ }里所给定的元素。
注意,[ ]内必须为空,不能在[ ]内指定数组长度,而是由{ }里元素的个数来决定数组的长度
此方式也可以定义和赋值分开:
int[] brr;
brr = new int[]{v1,v2,v3,v4,...}; // 这样也是可以的
2. 静态初始化
// 数据类型 []数组名 = {v1,v2,v3...};
int[] arr = {v1,v2,v3...};
数组的静态初始化也是确定长度和内容的。
注意,此方式不能先定义后赋值。即如果先声明数组,再用此种方式赋值是不可以的:
int[] brr;
brr = {v1,v2,v3...}; // 编译错误!!!
三、数组的属性
数组有一个长度属性,获得数组长度的方式为:数组名.length
int len = arr.length; // 获得数组arr的长度
在Java中允许数组的长度为0,即包含0个元素,这样的数组对象仍是一个Java对象,而且不同于null。虽然没有意义,但在语法上是合法的:
int[] arr = new int[0];
System.out.println(a.length); // 输出结果为0
四、访问数组元素
访问数组元素的方式为:数组名[下标]
arr[0]; // 访问数组a的第1个元素
下标的取值范围 [0,数组长度),下标为0表示数组的第1个元素,下标的最大值为 数组长度-1
不能超过下标范围进行元素访问,否则将引发数组中最常见的:
java.lang.ArrayIndexOutOfBoundsException 数组下标越界异常
比如
int []arr ={1,2,3,4};
这个数组的长度为4,如果调用arr[4],运行时就会报数组越界异常:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
at review.ErrorTest.main(ErrorTest.java:21)
异常提示了发生错误的时候,下标的值为4
因为下标为0表示数组的第1个元素,即这个数组的元素只有arr[0]=1, arr[1]=2, arr[2]=3, arr[3]=4,没有arr[4]
五、二维数组
如果数组中的元素也是数组,这样就可以组成多维数组,比如二维数组、甚至更多层次的三维数组等等(当然一般超过三维也没什么实际用处了,所以主要掌握二维数组就好了)。
1.数组声明
与一维数组声明类似,多一个[ ]
// 数据类型 [][]数组名;
int[][] arr ;
2.数组初始化
(1) 初始化一维数组(指定一维数组长度)
数据类型 [][]数组名 = new 数据类型[二维数组长度][一维数组长度];
int[][] arr = new int[3][4];
arr这个二维数组里有3个元素,都是长度为4、数据类型为int的一维数组,此时可以取某个数组里的元素的值,不过因为没给出具体值,所以默认为0。
可以再给一维数组里的元素赋值,如:
arr[0][0] = 11; // 第一个数组里的第一个值
arr[1][0] = 21; // 第二个数组里的第一个值
arr[2][0] = 31; // 第三个数组里的第一个值
另外要知道,二维数组真正存储的其实是一维数组的地址信息。
(2) 不初始化一维数组(不指定一维数组长度)
数据类型 [][]数组名 = new 数据类型[二维数组长度][];
int [][] arr = new int[3][];
此时只说明了arr这个二维数组里有3个元素,都是数组,但这些一维数组并没有初始化过,即arr这个二维数组中的arr[0]、arr[1]、arr[2]这3个数组都是null。
所以此时不可以取一维数组里具体元素的值,否则运行会报错
java.lang.NullPointerException 空指针异常
int [][] arr = new int[3][]; // 一维数组没有初始化
System.out.println(arr[0][1]);
-----------------控制台输出--------------------
Exception in thread "main" java.lang.NullPointerException // 空指针异常
at review.ErrorTest.main(ErrorTest.java:21)
由于一维数组arr[0]的变量没有指向任何数组对象,这个时候对该数组名进行 . 和 [ ] 的访问就会报空指针异常错误。
需要继续将一维数组初始化后才能进行取值,而且由于一维数组分别进行初始化,所以他们的长度可以不一样
数组名[下标] = new 数据类型[数据长度];
arr[0] = new int[4];
arr[1] = new int[3];
arr[2] = new int[2];
System.out.println(arr[0][1]);
当然此时控制台还是输出0,因为数组里的元素还没有赋值,默认为0
(3)静态初始化
// 数据类型 [][]数组名 = new 数据类型[][]{{v1,v2,...},{v3,v4,..},{v5,...}...};
int [][] arr = new int[][]{{v1,v2,...},{v3,v4,..},{v5,...}...};
与一维数组的静态初始化类似,直接给出了二维数组中的所有一维数组的所有内容