数组
(一)
最基本的一种数据结构 — 数据的排列方式, 数组是第一种引用类型
基本数据类型: byte\short\int\long\float\double\char\boolean
数组的初始化
- 数组的类型是固定的, 只能存相同类型的数据
- 数组一旦确定, 数组的长度是不可变的:arr.length
- 数组元素: 通过下标/索引 index
index范围: 0 ~ length-1 - 访问\赋值:arr[index]
- 数组遍历/迭代: for循环
// 数组的声明
int[] arr;
// 数组的初始化: 一共3种方式
// 方式一: 在声明的同时初始化, 已经确定数组内容
int[] arr1 = {1, 2, 3, 4};
// 不能使用方式一再次赋值
// arr1 = {2, 3, 4, 5}; // 编译错误
// 方式二: 在声明的同时初始化, 已经确定数组内容
int[] arr2 = new int[]{1, 2, 3, 4, 5};
// 使用方式二可以再次赋值
arr2 = new int[]{3, 4, 5, 6, 7, 8, 9};
// 方式三: 在声明的同时初始化, 只能确定长度, 内容全部都是默认值
// 默认值: 整数-0, 浮点-0.0, char-\u0000, boolean-false
int[] arr3 = new int[5];
直接输出数组名是地址
System.out.println(arr);// [I@2471cca7 -> 地址
(二)
// int 类型的数组arr
int[] arr = new int[3];
// arr[0] -- int类型
//定义一个 int[] 类型的数组a, 数组长度是4
//a中第一个元素有5个元素
//a中第二个元素有3个元素
//a中第三个元素有6个元素, 其中第3个是 2
int[][] a = new int[4][];
// a[0] --> int[] 类型
a[0] = new int[5];
a[1] = new int[3];
a[2] = new int[6];
// a[2] 表示一个int数组
// a[2][2] 表示一个int数
a[2][2] = 2;
// 二维数组: 数组中存数组
//定义一个 int[] 类型的数组b, 数组长度是3
//b中的每一个元素, 都有4个元素
//b中的第2个元素的第4个元素, 是 5
//b中的每一个元素都是5
int[][] b = new int[3][4];
b[1][3] = 5;
for (int i = 0; i < b.length; i++) {
for (int j = 0; j < b[i].length; j++){
b[i][j] = 5;
}
}
/*for(int i = 0; i < b.length; i++) {
b[i] = new int[4];
}*/
数组扩容
- 创建新的数组
- 将原来的元素复制到新数组中
void System.arraycopy
// 需求: 让arr变成 {1,2,3,4,5,6}
int[] arr = {1,2,3,4,5};
// 1.数组扩容
int[] b = new int[arr.length+1];
// 2.数组复制
/*
参数1: 要复制的数组 - 源数组
参数2: 从要源数组的哪个位置开始复制
参数3: 要复制到哪个数组中 - 目标数组
参数4: 要从b数组的哪个位置开始存放值
参数5: 要复制几个元素
*/
System.arraycopy(arr, 0, b, 0, arr.length);
// 3.再最后加一个6
b[b.length - 1] = 6;
// 4.将arr替换
arr = b;
有返回值 Arrays.copyOf
// 需求: 让arr变成 {1,2,3,4,5,6}
int[] arr = {1,2,3,4,5};
// 参数1: 要复制的数组 -> 源数组
// 参数2: 要生成的新数组的长度
// 返回值: 生成的新数组
arr = Arrays.copyOf(arr, arr.length + 1);
arr[arr.length - 1] = 6;
引用类型的数组
- 给数组初始化
Student[] ss = new Student[5]; // 默认值都是null
- 给数组元素初始化
ss[0] = new Student();
ss[1] = new Student();
...
常见问题
NullPointerException: 空指针异常
产生原因: 调用了null空对象的 成员变量 或者 方法
// 引用类型数组
// 默认值 null
Student[] arr = new Student[3];
System.out.println(arr[0]); // null
// 要给第一个student对象, 修改name值为 "小俊"
//arr[0].name = "小俊"; //error
arr[0] = new Student("小明", 21, null);
arr[0].name = "小俊";