数组的定义
java中的数组是在连续内存空间中的一种存储相同类型数据的数据结构。为了批量管理相同类型的数据,java引入了数组,数组的格式为:数据类型[]
,如:int[]
、String[]
等等。正因为在内存分配是连续的空间,所以数组长度是不可变的。
数组的创建
当我们了解了数组是什么东西之后,当我们想要使用数组时应该怎么创建一个数组呢?下面是数组的两种创建方式(以整型数组为例):
静态创建
静态创建数组的语法为: 数据类型[] 变量名 = {数据};
。其中数据之间用逗号隔开。
int[] arr = {1,2,3,4,5};
动态创建
动态创建有两种写法:
一种为数据类型[] 变量名 = new int[数组长度];
创建一个长度为5的数组,并默认初始化为0。
int[] arr2 = new int[5];
另一种方式为数据类型[] 变量名 = new int[]{数据};
创建一个长度自适应的数组,并将它初始化。
int[] arr3 = new int[]{1,2,3,4,5};
静态创建数组和动态创建数组的区别:静态创建数组时必须初始化值,数组长度根据输入数据的个数计算。而动态创建数组(如arr2)不必初始化,只需指定长度,默认初始化为0。
数组的常用操作
1、访问
- 通过
arr[2]
访问数组 arr 索引为 2 的值。
2、修改
- 通过
arr[i] = 10;
将数组 arr 索引为 i 的值覆盖为10。
3、遍历
- 由于创建的数组是一个对象,所以直接输出的话会调用基类Object中默认的toString方法,返回该对象的地址,如
System.out.println(arr);
的输出为
这时我们就要借助官方提供的方法(Arrays.toString)来帮助我们遍历数组,System.out.println(Arrays.toString(arr));
,结果如下
这样前面就能清楚的看见数组的内容了。
4、扩容
- 到这有的同学可能要问了,博主你骗人,你不是说数组不能扩容吗?
没错,数组确实不能扩容,但是当我们这个数组长度不够用了怎么办呢?我们可以新建一个更大的数组呀,然后将当前数组复制到大的数组就行了。现有的一些数组扩容的方式全是基于新建-复制的思想进行扩容的,下面我们来举一些例子:
①、普通的新建-复制方法:
public static void main(String[] args) {
int[] arr = {1,2,3};
int[] arr2 = new int[10];
for (int i = 0; i < arr.length; i++) {
arr2[i] = arr[i];
}
System.out.println(Arrays.toString(arr2));
}
输出如下
②、使用System.arraycopy
方法进行复制数组,System.arraycopy(arg0,arg1,arg2,arg3,arg4)
方法的参数分别为,
arg0:被复制数组;arg1:被复制元素初始索引;arg2:新数组;arg3:新数组初始索引;arg4:复制长度。
public static void main(String[] args) {
int[] arr = {1,2,3};
int[] arr2 = new int[10];
System.arraycopy(arr,0,arr2,0,arr.length);
System.out.println(Arrays.toString(arr2));
}
输出如下
③、调用Arrays.copyOf(arr,len)
,其中参数arr为被复制数组,len为新数组的长度。
public static void main(String[] args) {
int[] arr = {1,2,3};
int[] arr2= Arrays.copyOf(arr,10);
System.out.println(Arrays.toString(arr2));
}
输出结果
可以看出以上三种方法实际上都是基于新建-复制方法的数组扩容方法,所以我们对数组进行扩容的思路就是:先创建一个更大的数组、然后将原来数组复制到新数组中。这样得到的数组就能满足我们的使用要求了。
常见的关于数组的异常
-
1、越界异常:如果我们查询的数组索引超过数组大小或小于0,就会报出类似下面的异常,这在复杂的编程任务中经常见到,这时我们只需要仔细查看数组的索引是否越界就可以迎刃而解了。
java.lang.ArrayIndexOutOfBoundsException: Index 4 out of bounds for length 3
-
2、空指针异常:空指针异常是指当数组为 null 时,调用数组的一些方法,如length,就会因为对象为 null 而报空指针异常。
-
Exception in thread "main" java.lang.NullPointerException: Cannot read the array length because "arrays" is null