JavaSE个人学习心得(六)
数组
一维数组
数组是一种容器,可以存储多个,同种类型的元素
定义格式:
1. 数据类型[] 数组名;
2. 数据类型 数组名[];
注意: 这种定义格式, 只是定义出了数组类型的变量, 容器还没有创建出来, 数据也没有存进去
格式化
- 静态格式化
完整格式:
数据类型[] 数组名 = new 数据类型[]{元素1, 元素2, 元素3...};
简化格式:
数据类型[] 数组名 = {元素1, 元素2, 元素3...};
- 动态格式化
在初始化的时候, 只需要指定数组的长度, 系统就会分配**默认初始化值**
格式:
数据类型[] 数组名 = new 数据类型[长度];
细节:打印数组名的时候,会看到数组的内存地址
[I@233ab4c
@ : 分隔符
[ : 当前空间是一个数组类型, 几个中括号, 就是几维数组
I : 当前容器是一个int类型
233ab4c : 十六进制内存地址
- 默认初始化值分类
整数 : 0
小数 : 0.0
布尔 : false
字符 : ‘\u0000’ --> Unicode字符 --> 空白字符
引用数据类型 : null
引用数据类型 : 数组, 类, 接口
两种初始化的区别:
动态初始化 : 手动指定长度, 系统分配默认值
静态初始化 : 手动指定元素, 由系统计算出数组的长度
使用场景:
静态初始化 : 如果要操作的数据, 需求中已经明确给出了, 那就直接静态初始化
动态初始化 : 只知道要存储几个数据, 但是不明确具体元素的时候, 建议使用动态初始化
1. 需求: 键盘录入5个整数, 求最大值
2. 需求: 产生10个1~100之间的随机数, 求最小值
数组的遍历操作
对数组中的每一个元素进行操作,就可以对数组进行遍历
格式:
for(int i = 0; i < 数组名.length; i++){
// 操作
}
快捷键: 数组名.fori + 回车
数组名.length : 动态获取到数组的长度(元素的个数)
数组的常见问题
ArrayIndexOutOfBoundsException : 数组索引越界异常
原因: 当访问了不存在的索引
NullPointerException : 空指针异常
原因: 当一个引用数据类型的变量, 记录到null之后, 跟堆内存的指向就被切断了
这时候再想访问堆内存数据, 就会出现空指针异常
例:
int[] arr = null;
System.out.println(arr[0]);
二维数组
二维数组也是一种容器,容器中存储的是一位数组
理解:容器的嵌套
什么时候去使用二维数组?
发现要操作的多组数据, 又是同一组数据, 就可以考虑使用二维数组来进行维护
第一季度:22,66,44
第二季度:77,33,88
第三季度:25,45,65
第四季度:11,66,99
初始化
- 静态初始化
完整格式
数据类型[][] 数组名 = new 数据类型[][]{ {一维数组1}, {一维数组2} };
int[][] arr = new int[][] {
{11,22,33},
{33,44,55}
};
简化格式:
数据类型[][] 数组名 = { {一维数组1}, {一维数组2} };
int[][] arr = {
{11,22,33},
{33,44,55}
};
System.out.println(arr[1][0]); // 33
- 动态初始化
格式:
数据类型[][] 数组名 = new 数据类型[m][n];
m : 指定这个二维数组, 可以存储多少个一维数组
n : 指定每一个一维数组, 可以存储多少个元素
int[][] arr = new int[2][3];
这个二维数组, 可以存储两个2一维数组, 每一个一维数组可以存储3个元素.
也可以将提前创建好的一维数组直接存入二维数组
int[][] arr = new int[2][3];
int[] arr1 = {11,22,33};
int[] arr2 = {44,55,66};
arr[0] = arr1;
arr[1] = arr2;
二维数组的遍历操作
思路
- 遍历二维数组获取到每一个一维数组
- 遍历每一个一维数组,获取到每一个元素
int[][] arr = {
{11,22,33},
{33,44,55}
};
for(int i = 0; i < arr.length; i++){
// arr[i] : 每一个一维数组
for(int j = 0; j < arr[i].length; j++){
System.out.println(arr[i][j]);
}
}