3.1 数组介绍
3.1.1 一维数组
- 定义:存放同一类型数据的组合。是一种引用数据类型。
- 动态初始化——方式一:
- 声明、创建、定义:
数据类型 数组名[] = new 数据类型[大小]
数据类型[] 数组名 = new 数据类型[大小]
- 初始化:
a[0] = 1;……
- 动态初始化——方式二:
- 声明数组:
数据类型 数组名[];
数据类型[] 数组名;
- 声明数组时,[]内不能写数组大小。
- 创建数组(分配空间):
数组名 = new 数据类型[大小];
- 初始化:
a[0] = 1;……
- 静态初始化——方式一:
数据类型 数组名[] = {值1, 值2,……}
数据类型[] 数组名 = {值1, 值2,……}
- 静态初始化时,[]内不能写数组大小。
- 静态初始化——方式二:
数据类型 数组名[] = new 数据类型[]{值1, 值2,……}
数据类型[] 数组名 = new 数据类型[]{值1, 值2,……}
- 静态初始化时,[]内不能写数组大小。
- 注意事项:
- 数组创建后,如果没有进行初始化,默认初始值如下:
- byte、short、int、long:0
- float、double:0.0
- char:\u0000(空字符)
- boolean:false
- String:null
- 数组是引用类型,是对象类型的一种。
- 数组定义后不能直接改变大小(容量),但可以通过以下两种方式改变大小
- 数组的拷贝:将一个大容量的数组赋值给小容量的数组
- 通过new关键字重新确定容量大小。
动态初始化情况下改变传入变量的大小控制数组的大小。
3.1.2 二维数组
- 动态初始化——方式一:
- 声明、创建、定义:
数据类型 数组名[][] = new 数据类型[大小][大小]
数据类型[][] 数组名 = new 数据类型[大小][大小]
数据类型[] 数组名[] = new 数据类型[大小][大小]
- 初始化:
a[0][0] = 1;……
- 或者
a[0] = {1,3……}
- 未初始化的默认值:
a[0]
:指向内存地址。a[0][0]
:输出该数组对应数据类型的默认值。
- 动态初始化——方式二:
- 声明数组:
数据类型 数组名[][];
数据类型[][] 数组名;
数据类型[] 数组名[];
- 创建数组(分配空间):
数组名 = new 数据类型[大小][大小];
- 初始化:
a[0][0] = 1;……
- 或者
a[0] = {1,3……}
- 未初始化的默认值:
a[0]
:指向内存地址。a[0][0]
:输出该数组对应数据类型的默认值。
- 动态初始化——列数不确定:
- 声明数组:
数据类型 数组名[][] = new 数据类型[大小][]
数据类型[][] 数组名 = new 数据类型[大小][]
数据类型[] 数组名[] = new 数据类型[大小][]
数据类型 数组名[][];数组名 = new 数据类型[大小][];
数据类型[][] 数组名;数组名 = new 数据类型[大小][];
数据类型[] 数组名[];数组名 = new 数据类型[大小][];
- 初始化:
a[0] = new int[1];……
- 或者
a[0] = {1,3……}
- 注意点:
数据类型 数组名[][] = new 数据类型[a][]
声明了具有a个一维数组的二维数组,但一维数组内部的元素个数还不确定。数据类型 数组名[][] = new 数据类型[][a]
这种声明方式非法。
- 未初始化的默认值:
a[0] = new int[3];a[0]
:指向内存地址。没有a[0] = new int[3];直接a[0]
:null。a[0] = new int[3];a[0][0]
:输出该数组对应数据类型的默认值,本例为0。没有a[0] = new int[3];直接a[0]
:报错。
- 静态初始化——方式一:
数据类型 数组名[][] = {{值1, 值2,……},{值1, 值2,……},{值1, 值2,……}}
数据类型[][] 数组名 = {{值1, 值2,……},{值1, 值2,……},{值1, 值2,……}}
数据类型[] 数组名[] = {{值1, 值2,……},{值1, 值2,……},{值1, 值2,……}}
- 静态初始化时,[]内不能写数组大小。
- 静态初始化——方式二:
数据类型 数组名[][] = new int[][]{{值1, 值2,……},{值1, 值2,……},{值1, 值2,……}}
数据类型[][] 数组名 = new int[][]{{值1, 值2,……},{值1, 值2,……},{值1, 值2,……}}
数据类型[] 数组名[] = new int[][]{{值1, 值2,……},{值1, 值2,……},{值1, 值2,……}}
- 静态初始化时,[]内不能写数组大小。
- 特殊写法情况:int[] x,y[]; x是一维数组,y是二维数组。
3.2 数组操作
3.2.1 基本操作
- 拷贝数组:
- 基本数据类型:
b=0;a=b;
,两个数值互不影响,拷贝的是数据。 - 引用数据类型:
int[] arr1 = {1,2……};arr2 = arr1;
- 默认情况下:拷贝的是内存中的地址,arr1和arr2不论哪个的值变化,都会引起另外一个的变化。
- 值拷贝方式:给arr1和arr2分别开辟独立的内存空间。
int[] arr1 = {1,2……};int[] arr2 = new int[arr1.length];
- 反转数组:
- 交换数据法:
- 逆序赋值法:
- 数组扩容:
- 创建新数组,新数组添加元素,将新数组赋值给旧数组。
- 数组缩减:
创建新数组,新数组长度比旧数组少1,循环赋值。
- 数组排序:
- 内部排序:将所有数据加载到内存中进行排序。
- 冒泡排序:
- 外部排序:数据量过大,无法全部加载到内存中,借助外部的存储空间进行排序。
- 数组查找:
- 顺序查找:
- 二分查找:
3.2.2 Arrays工具类(常用)
Arrays.equals(int[] a, int[] b)
:
- 返回
boolean
,boolean isEquals = Arrays.equals(a, b);
- 返回true的条件:两数组指向同一个内存地址(a=b)、a和b内部的元素值相等
- 返回false的条件:两数组均为null、a和b内部的元素值不想等
- 除int外,其余各种类型的对象都可判断
Arrays.toString(int[] a)
:
- 返回
String
,String aStr = Arrays.toString(a);
- 输出为
[值1,,……]
的形式,实际为字符串的拼接
Arrays.fill(int[] a,10)
- 返回为空,所以不能赋值给其他语句。
- 表示将数组a的所有元素替换为10。
Arrays.sort(int[] a)
- 返回为空,所以不能赋值给其他语句。
- 表示将数组a按照从小到大的顺序排序,底层排序方式为快速排序。
Arrays.binarySearch(int[] a, 10)
:
- 返回
int
,int index = Arrays.binarySearch(a, 10);
- 返回值为正数时,为目标数据(10)所在的元素下标。返回值为负数时,表示没找到。
- 底层排序方式为二分法查找。
- 使用上述方法需要引入对应的工具类:
import java.util.Arrays;
1.4.5 数组常见异常
- 编译时不报错,运行出错。
ArrayIndexOutOfBoundsExcetion
:
- 角标越界:
- 角标为负数
- 角标为数组长度(应为数组长度-1)
NullPointerException
:
- 数组指向null
- 数组只声明、未初始化
- 数组赋值为null
- 不定列二维数组某个一维数组未初始化,访问了该一维数组的具体值。
- 一维字符串数组的某个值赋值为空。
3.2.4 数组输出问题
- 详见(详见Java问答,1.4.14).
- 一维数组:
- 声明未创建(没有指定数组大小):编译报错
- 声明并初始化(指定数组大小):输出数组显示内存地址、输出元素显示默认值或指定值
- 二维数组:
- 声明未创建(没有指定数组大小):编译报错
- 声明并初始化(指定数组大小):
- 指定两个大小:输出数组显示内存地址、输出一维元素显示内存地址或一维数组、输出二维元素为默认值或指定值
- 指定一个大小:输出数组显示内存地址、输出一位元素显式为空、输出二维元素编译不报错,运行报错