今日内容
- 数组介绍及动态初始化
- 数组内存结构及静态初始化
- 数组常见问题及练习
01. 数组的概述和定义格式
- 什么是数组?
- 该如何定义数组?
总结:
1: 数组就是一个【容器】,用来存储【同种数据类型】的多个值
2: 数据类型[] 数组名;
double[] dArr; // 这是定义了一个double类型的数组,数组名叫dArr
02. 数组初始化之动态初始化
- 数组有几种初始化方式?
- 如何实现动态初始化?
总结:
1:
动态初始化: 手动指定长度,由系统给出默认初始化值
静态初始化
2:
数据类型[] 数组名 = new 数据类型[数组的长度];
打印数组变量:
*
* [I@26a2bd15
*
* @ :分隔符
* [ :标识当前的数据是一个数组类型,几个空括号代表的是几维数组
* I :代表当前数组是一个int类型数组
* 26a2bd15 : 十六进制[地址值]
问题: 描述下列代码的每一步代表什么
char[] arr = new char[2];
char[] arr : 定义了数组类型变量, char类型数组,数组名叫arr
new char[2]; : 初始化了一个char类型数组,数组的长度为2
03. 数组操作之获取数组中的元素
- 什么是索引?
- 怎样通过索引操作数组中的元素?
总结:
1. 索引就是数组中,每一个元素的编号,编号从0开始,最大编号是数组的长度-1
索引, 下标, 角标
2. 数组名[索引]
- 练习:
(5分钟)
定义一个长度为6的数组
并给数组中每个元素赋值2,4,6,8,10,12
取出数组中所有的元素并打印
04. Java中的内存分配图解
- Java内存中分为那几块区域?
- 数组在内存中创建的过程?
总结:
1.
1. 桟内存 : 方法运行时,所进入的内存 -> 存放的一般都是变量
2. 堆内存:new出来的东西都进入堆内存 -> 内部的数据都会产生地址值
3. 方法区:.class文件加载的地方
------------------
4. 本地方法区 : 调用了操作系统底层资源
5. 寄存器:交给CPU去使用的
2. 再画一张
- 数据的默认初始化值为?
总结:
整数: 0
小数: 0.0
布尔: false
字符: \u0000
引用数据类型: null
05. 一个数组的内存图
- 案例演示: 创建数组存储元素.
- 看图说话 (要求自己会画)
06. 两个数组的内存图
- 案例演示: 定义两个数组,分别输出数组名及元素。然后分别给数组中的元素赋值,分别再次输出数组名及元素
- 看图说话 (看懂即可)
07. 两个数组指向同一个地址的内存图
- 案例演示:
- 定义两个数组,先定义一个数组,赋值,输出。
- 然后定义第二个数组的时候把第一个数组的地址赋值给第二个数组。
- 然后给第二个数组赋值,再次输出两个数组的名及元素。
- 看图说话 (看懂即可)
08. 数组初始化之静态初始化
- 数组的静态初始化格式为?
- 两种初始化有什么区别?
总结:
1. 完整格式:
数据类型[] 数组名 = new数据类型[]{元素1,元素2,元素3...};
简化格式:
数据类型[] 数组名 = {元素1,元素2,元素3...};
2. 动态初始化和静态初始化的区别:
动态: 手动给定长度,由系统给出默认初始化值
int[] arr = new int[3];
静态: 手动给出元素,由系统计算出数组的长度
int[] arr = {11,22,33};
应用:
什么时候用动态初始化?
如果要完成的需求,只明确了数据的数量,但是不明确具体的数值,就使用动态初始化
举例:键盘录入5个数据,存储到数组中并求和
什么时候用静态初始化?
如果要操作的数据都是现有的,就使用静态初始化
举例:将数据2,4,6,8,10存储到数组中并求和
09. 数组操作的两个常见小问题
- 常见的问题有哪些? 又是怎样引发的?
总结:
1: ArrayIndexOutOfBoundsException : 数组索引越界异常
原因:当访问了不存在的索引
2: NullPointerException : 空指针异常
原因:当引用数据类型的变量不再记录地址值,而还想使用变量去访问堆内存的数据,就会抛出此异常
10. 数组操作之遍历数组
- 什么是数组的遍历?
- 数组名.length代表的是什么?
总结:
1. 将数组中的每一个元素,取出来
2. 数组的长度
- 转ppt两个练习
11. 数组操作之获取最值
- 分析需求, 案例演示
12. 数组练习之评委打分
需求:
- 在编程竞赛中,有6个评委为参赛的选手打分,分数为0-100的整数分。
- 选手的最后得分为:去掉一个最高分和一个最低分后 的4个评委平均值。
- 请写代码实现。(不考虑小数部分)
分析:
- A:定义一个长度为6的数组
- B:键盘录入评委的分数
- C:获取最高分,最低分
- D:求评委的分数和
- E:平均分:(和-最高分-最低分)/(arr.length-2)
- F:输出平均分即可
13. 数组练习之不死神兔(斐波那切数列)
- 需求:
- 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子
- 假如兔子都不死,问第二十个月的兔子对数为多少?
* 1 1 2 3 5 8 13 21 ...
int[] arr = new int[8];
arr[0] = 1;
arr[1] = 1;
for(int i = 2; i < arr.length; i++){
arr[i] = arr[i-2] + arr[i-1];
}
System.out.println(arr[arr.length-1]);
- 如果求的月份过多, 会产生什么样的问题?
- BigInteger解决.
- TODO:// Api阶段补充