数组
P47 用来存储一批同种类数据的内存区域(可以理解为容器);
表示形式
数据类型 [ ] 数组名 = {若干数组元素中间用逗号隔开};
为什么需要数组:
定义变量储存大量数据 太麻烦了 (代码过于繁琐,需要大量变量的定义,业务功能实现也很麻烦)
数组比较适合做一批同种类型数据的存储。
数组需要的学会的东西:
- 定义,如何存储数据,具体格式是什么样的
- 如何访问数组元素,怎么操作,增删改查?
- 应用数组解决实际问题,怎么结合数组解决比如随机点名这类实际业务;
- 数据内存原理,数组在内存中具体是如何去工作的
- 静态初始化数组(数组的访问,数组的注意事项)
- 动态初始化数组(动态初始化数组的元素默认值)
- 数组的遍历
- 数组的案例
- 数组的内存图
- 数组使用的常见问题
- Debug工具的使用
P48静态初始化数组
定义数组的时候直接给数组赋值
数据类型[ ] 数组名 = new 数据类型[ ]{元素1,元素2,元素3....};
double[ ] scores = new double[ ]{89.9 , 99.5, 59.5,88.0}
//简化类型
数据类型[ ]数组名 = {元素1,元素2,元素3..};
int [ ]ages = {12 ,24,36};
数组的基本原理:
以上面的数组ages 为例, 数组名会在内存中开辟一片区域
数组内容会以连续的方式 12 24 36 以一个地址存放在内存中
Ages会对应地址名
当以数组名作为输出时:
其输出结果会是一个地址([表示这是一个数组,I代表数据类型是int,@后是十六进制具体地址)
数组变量名中存储的事数组在内存中的地址,数组是引用类型。
静态化是直接定义好内部元素的
那么如何访问数组中的数据
提供索引就是数组中元素的编号
数组名称[索引]
数组的最大索引可以怎么表示
比如一个length为3的数组,他的最大索引为2
数组名.length – 1 //前提:元素的个数大于0
两种方式:
数组定义可以是两种形式
int[ ] ages =
int ages [ ] =
什么类型的数组存放什么类型的数据,否则的一定报错
数组一旦定义出来,程序执行的过程中,长度、类型就都固定了
经典错误:想要输出的数组内容超过边界length了
P50 数组遍历
遍历 访问每一个数据 在搜索、数据统计等等都需要用到遍历
遍历是一个个的将数据访问一遍
使用for循环 进行遍历输出
数组中的一些应用:
- 数组求和
- 求数组元素最大值
求出一组元素中的最大值,首先是一堆数据的数组静态申明 然后引入一个中间变量和数组中的所有元素进行对比,把最大值始终赋值给中间变量,最后输出中间变量。
3猜数字游戏.(数组动态赋值)
这个程序有几个明显的问题:首先是重复出现未命中,没有完全break掉游戏 (引入OUT break OUT)
代码有冗余问题 接下来是标准答案
Standard Result:
随机排名游戏
冒泡排序:
数组内数据:5 2 3 1 从小到大排列
第一轮排查:5和2进行比较 5比2大 交换位置 2 5 3 1
5和3比较 5比3大 交换位置 2 3 5 1 再之后是2 3 1 5
第二轮排查:2和3进行比较 维持不动 再之后是2135
第三轮排查:1235
P52数组的内存分配 数组内存图
JAVA 对于内存的划分是很讲究的,分为栈、堆、方法区,本地方法栈,寄存器。
重点是对前面三类的描述:
通过数组代码理解下 在这个里面代码是如何运行储存的
方法区域首先会有一个class文件, 并将main方法提取到栈内存里
两个数组变量指向同一个数组对象
数组常见的使用问题:
- 如果访问的元素位置超过最大索引,执行时会出现ArrayIndexOutOfBoundsException(数据索引越界异常)。
- 如果数组变量中没有存储数组的地址,而是null,在访问数组信息时会出现NullPointerException(空指针异常)
P53 Debug工具:
程序员用来观察和debug代码