01-数组介绍
-
数组 : 就是一种容器, 可以存储同种数据类型多个值.
-
数组的使用场景 : 如果发现要维护的多个数据, 同一组数据.
-
举例 : 计算出两个班级各自学生的总成绩
-
100 90 100
-
int[] class1Arr = {100,90,100};
-
-
10 20 30
-
int[] class2Arr = {10,20,30};
-
-
-
02-数组的定义格式
-
数据类型[] 数组名;
-
int[] arr;
-
-
数据类型 数组名[];
-
int arr[];
-
-
注意 : 这种写法, 仅仅是创建了数组类型的变量, 还没有真正的将数组容器创建出来.
03-数组静态初始化
-
完整格式 :
数据类型[] 数组名 = new 数据类型[]{元素1, 元素2, 元素3...}; int[] arr = new int[]{11,22,33}; // 错误代码 int[] arr = new int[3]{11,22,33};
-
简化格式 :
数据类型[] 数组名 = {元素1, 元素2, 元素3...}; int[] arr = {11,22,33};
04-数组的元素访问
-
打印数组名的时候 ---- 会看到数组在内存的地址值.
[I@344a6fc
-
数组元素访问格式 :
-
数组名 [索引]
-
索引 (角标, 下标) : 数组中每一个空间所对应的编号,编号从0开始, 逐个+1增长.
-
System.out.println(arr[0]); // 访问0号元素并打印 if(arr[0] % 2 == 0){ // 访问0号元素并判断 } int result = arr[0] + 100l // 访问0号元素并计算 arr[0] = 100; // 访问0号元素并修改. for(int i = 1; i <= arr[0]; i++){ System.out.println("HelloWorld"); }
05-数组的遍历操作
-
数组遍历 : 将数组中[每一个]元素, 取出来的过程 (打印, 判断, 求和...)
-
数组的属性 : 数组名.length; -------- 动态获取到数组中 ( 元素的个数 ) ( 长度 )
for(int i = 0; i < arr.length; i++){ } 快捷键 : 数组名.fori
任务 : 课上所有关于遍历的案例, 务必掌握.
06-数组的动态初始化
-
格式 :
数据类型[] 数组名 = new 数据类型[长度]; int[] arr = new int[5];
-
效果 : 在创建数组的时候, 手动指定长度, 系统会分配默认初始化值.
-
默认初始化值 :
-
整数 : 0
-
小数 : 0.0
-
布尔 : false
-
字符 : '\u0000' Unicode字符 --> 空白字符
-
引用数据类型 (类, 接口, 数组) : null
-
-
动态初始化和静态初始化的区别
-
静态初始化 : 在创建数组的时候, 手动指定元素, 系统计算出数组的长度
-
int[] arr = {11,22,33,44,55};
-
-
动态初始化 : 在创建数组的时候, 手动指定长度, 系统会分配默认初始化值.
-
int[] arr = new int[3];
-
-
可以发现, 根据这个区别, 是无法确定今后的使用场景.
-
使用场景 :
-
静态初始化 : 如果要操作的数据, 已经明确给出了, 直接静态初始化
-
记录班级学生的成绩, 成绩为 11 22 33
-
int[] arr = {11,22,33};
-
-
动态初始化 : 只明确元素的个数, 但是不明确具体数值
-
键盘录入5个整数, 存入数组.
-
产生10个1-100之间的随机数, 存入数组.
-
-
键盘录入5个整数, 存入数组.
静态初始化实现: Scnnaer sc = new Scanner(System.in); int num1 = sc.nextInt(); int num2 = sc.nextInt(); int num3 = sc.nextInt(); int num4 = sc.nextInt(); int num5 = sc.nextInt(); int[] arr = {num1, num2, num3, num4, num5};
动态初始化实现: Scnnaer sc = new Scanner(System.in); int[] arr = new int[5]; for(int i = 0; i < arr.length; i++){ arr[i] = sc.nextInt(); }
07-数组的内存图解
-
一个数组内存图 : 自己会画
-
两个数组指向相同内存图 : 打开PPT将流程梳理清楚即可
-
Java 中的内存模型
-
栈 : 方法运行时, 所进入的内存.
-
堆 : new 出来的内容进入堆内存, 开辟空间产生地址值, 还有默认初始化值.
-
方法区 : 字节码文件加载时所进入的内存
-
本地方法栈 : 调用操作系统相关资源的方法, 还有一些C语言的相关功能.
-
此类方法在源码中, 通常被 native 关键字所修饰
-
这种代码我们是看不到内部实现的.
-
-
-
寄存器 : 交给CPU使用
-
08- 数组常见的两个问题
-
ArrayIndexOutOfBoundsException : 索引越界异常
-
当访问了不存在的索引, 就会出现此异常
-
-
NullPointerException : 空指针异常
-
当一个引用数据类型的变量, 记录到null值之后, 还想去访问堆内存数据, 就会出现此异常.
-
09-二维数组介绍
-
介绍 : 二维数组也是一个容器 , 容器中存储的是一维数组.
-
使用场景 :
-
如果发现要维护的多组数据, 也是一个整体的话, 就可以考虑使用二维数组来对数据进行位数.
-
举例 :
int[] class1Arr = {100,90,100}; int[] class2Arr = {10,20,30}; // 使用大的数组, 将两个班级的成绩存储起来. int[][] schoolScores = { {100,90,100}, {10,20,30} };
int[] month1 = {11,22,33}; int[] month2 = {11,22,33}; int[] month3 = {11,22,33}; int[] month4 = {11,22,33}; int[][] arr = { {11,22,33}, {11,22,33}, {11,22,33}, {11,22,33} };
-
10-二维数组静态初始化
-
完整格式 :
数据类型[][] 数组名 = new 数据类型[][]{ {元素1, 元素2}, {元素3, 元素4} }; int[][] arr = new int[][]{ {11,22}, {33,44} };
-
简化格式 :
数据类型[][] 数组名 = { {元素1, 元素2}, {元素3, 元素4} }; int[][] arr = { {11,22}, {33,44} };
11-二维数组的元素访问
-
访问格式 :
-
数组名[索引] : 访问的是二维数组中, 存储的一维数组.
数组名[索引1][索引2] : 索引1: 访问二维数组中的哪一个一维数组 索引2: 访问的是一维数组中具体的哪一个元素. int[][] arr = { {11,22}, {33,44} }; System.out.println(arr[1][0]);
-
12-二维数组的遍历操作
-
思路
-
遍历二维数组, 获取每一个一维数组
-
遍历一维数组, 获取每一个元素
-
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]); } }
13-二维数组的动态初始化
-
格式 :
数据类型[][] 数组名 = new 数据类型[m][n]; //能够存储两个一维数组, 每一个一维数组中可以存储3个元素 int[][] arr = new int[2][3];
public class ArrayDemo3 { /* 细节: 可以提前准备好一维数组, 统一的存入二维数组中. 原因: 二维数组存储的就是一维数组的内存地址 */ public static void main(String[] args) { int[] arr1 = {11, 22, 33}; int[] arr2 = {44, 55, 66, 77}; int[][] arr = new int[2][3]; arr[0] = arr1; arr[1] = arr2; for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr[i].length; j++) { System.out.println(arr[i][j]); } } } }