1. 数组-存储多个同类型的数据
1.1 数组定义
数据类型[] 变量名
数据类型 变量名[]
不推荐使用 定义一个int变量 该变量为数组
1.2 数组初始化
-
动态初始化
数据类型[] 变量名 = new 数据类型[数组长度]
数组里面的数据初始值由计算机分配int[] arr = new int[4]; /* * 左边: int 数据类型 * [] 表明是数组 * arr 变量名 * 右边: new 申请空间 * int 存储数据类型 * [] 表明是数组 * 4 数组长度,元素个数 * */
-
静态初始化
数据类型[] 变量名 = new 数据类型[] {item1, item12, item13, ····}
指定数组里面每个元素的值,数组长度由计算机分配推荐简化格式
数据类型[] 变量名 = {item1, item12, item13, ····}
// int[] arr = new int[] {1, 2, 3}; int[] arr = {1, 2, 3}; System.out.println(arr); // 地址 [I@16b98e56 System.out.println(arr[0]); // 拿取arr地址 根据索引 获取地址中数据 1 System.out.println(arr[1]); // 拿取arr地址 根据索引 获取地址中数据 2 System.out.println(arr[2]); // 拿取arr地址 根据索引 获取地址中数据 3
1.3 数组元素访问
-
访问数组名----拿到数组地址
int[] arr = new int[4]; System.out.println(arr); // [I@16b98e56
-
访问数组元素—索引获取
Note: 索引从零开始 到数组长度-1
int[] arr = new int[4]; System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); System.out.println(arr[3]);
1.4 java内存分配
-
初始化内存分配
-
左边 int[] arr
在栈内存 创建数组变量 arr -
右边 new int[4]
在堆内存中开辟连续空间 用地址例如[I@16b98e56
表明整个数组位置 在连续空间中划分索引和存储数据 -
在堆内存中不同数据类型初始化数据
整数 0; 浮点数 0.0; 布尔值 false; 字符 空字符; 引用数据类型 null;
-
数组中元素是根据索引查找地址
arr[2] = arr地址 + 数据类型占用空间 * 2
-
-
访问流程
System.out.println(arr);
拿到数组的地址[I@16b98e56
System.out.println(arr[1]);
先拿到数组的地址[I@16b98e56
然后根据索引查找元素地址arr地址 + int数据类型占用空间 * 1
,最后拿到地址中的值0
-
栈内存和堆内存的区别
-
栈内存 : 存储局部变量
局部变量:定义在方法的变量 使用完立即消失
-
堆内存:存储new出来的内容
(实体 new int[2] 对象 new Random())
new 出来的内容都有地址值,使用完之后会在垃圾回收器空闲时被回收
-
1. 5 数组内存应用
-
单个数组内存
int[] arr = new int[2]; // 左边 栈内存 arr 右边 堆内存 new 开辟空间 创建索引 初始化数值 返回地址 System.out.println(arr); // 拿取arr地址 [I@16b98e56 System.out.println(arr[0]); // 拿取arr地址 根据索引 获取地址中数据 0 System.out.println(arr[1]); // 拿取arr地址 根据索引 获取地址中数据 0 arr[0] = 100; // 拿取arr地址 根据索引 修改地址中数据 0变100 System.out.println(arr); // 拿取arr地址 [I@16b98e56 System.out.println(arr[0]); // 拿取arr地址 根据索引 获取地址中数据 100 System.out.println(arr[1]); // 拿取arr地址 根据索引 获取地址中数据 0
-
多个数组内存 不同地址 不同变量 都有new
double[] arr1 = new double[2]; // 左边 栈内存 arr1 右边 堆内存 new 开辟空间 创建索引 初始化数值 返回地址 double[] arr2 = new double[3]; // 左边 栈内存 arr2 右边 堆内存 new 开辟空间 创建索引 初始化数值 返回地址 System.out.println(arr1); // 拿取arr1地址 [D@16b98e56 System.out.println(arr1[0]); // 拿取arr1地址 根据索引 获取地址中数据 0.0 System.out.println(arr2); // 拿取arr2地址 [D@7ef20235 System.out.println(arr2[0]); // 拿取arr2地址 根据索引 获取地址中数据 0.0 arr1[1] = 1.23; // 拿取arr1地址 根据索引 修改地址中数据 0.0变1.23 arr2[1] = 2.00; // 拿取arr2地址 根据索引 修改地址中数据 0.0变2.00 System.out.println(arr1); // 拿取arr1地址 [D@16b98e56 System.out.println(arr1[1]); // 拿取arr1地址 根据索引 获取地址中数据 1.23 System.out.println(arr2); // 拿取arr2地址 [D@7ef20235 System.out.println(arr2[1]); // 拿取arr2地址 根据索引 获取地址中数据 2.0
-
多个数组内存 相同地址 指向同一地址
String[] arr1 = new String[2]; // 左边 栈内存 arr1 右边 堆内存 new 开辟空间 创建索引 初始化数值 返回地址 System.out.println(arr1); // 拿取arr1地址 [Ljava.lang.String;@16b98e56 System.out.println(arr1[0]); // 拿取arr1地址 根据索引 获取地址中数据 null String[] arr2 = arr1; // 将 arr1 的地址 赋值给 arr2 --arr1 arr2 指向同一地址 arr2[0] = "java"; // 拿取arr2地址 根据索引 修改地址中数据 null变"java" System.out.println(arr1); // 拿取arr1地址 [Ljava.lang.String;@16b98e56 System.out.println(arr2); // 拿取arr2地址 [Ljava.lang.String;@16b98e56 System.out.println(arr1[0]); // 拿取arr1地址 根据索引 获取地址中数据 "java" System.out.println(arr2[0]); // 拿取arr2地址 根据索引 获取地址中数据 "java"
1.6 数组常见问题
-
索引越界
int[] arr = new int[3]; // 索引 0 1 2 System.out.println(arr[3]); // ArrayIndexOutOfBoundsException
-
空指针异常
int[] arr = {1, 2, 3}; System.out.println(arr); // [I@16b98e56 System.out.println(arr[0]); // 1 arr = null; System.out.println(arr); // null System.out.println(arr[0]); // NullPointerException
-
null 空指针 引用类型的默认值,表示不指向任何有效对象
1.7 数组常见操作
-
遍历
数组名.length 数组元素个数
int[] arr = {1, 3, 4, 0, 9, 3, 4, 5, 6, 7, 8, 0}; for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); }
int[] arr = {1, 3, 4, 0, 9, 3, 4, 5, 6, 7, 8, 0}; for (int x: arr) { // 数组中每一个元素 System.out.println(x); }
-
获取数组最值
遍历比较 数组第一个元素进行初始化
int[] arr = {1, 3, 4, 0, 9, 3, 4, 5, 6, 7, 8, 0}; int maxNum = arr[0]; int minNum = arr[0]; for (int x: arr) { maxNum = maxNum > x ? maxNum : x; minNum = minNum < x ? minNum : x; } System.out.println(maxNum); System.out.println(minNum);