7.数组
- 知识回顾
- 以前学习过变量,我们知道变量可根据需要存储不同的数据,但是它在同一时间只能存储一个数据
- 如果程序需要在同一时间处理多个数据,如果只用变量,就需要定义很多的变量,效率不高,数组就可以解决此问题了
- 什么是数组
- 相同数据类型的数据集合
- 分类
- 一维数组
- 二维数组(实际上还是一维数组)
- 数组的作用
- 可存储多个相同数据类型的数据
- 如何使用数组
-
一维数组定义语法(思路同变量,语法不同)
-
先声明后赋值
-
声明并赋值
-
-
一维数组基本特征
-
线形记录数据(根据单个下标访问数据)
-
数组下标
- 它是数组中每个数组的索引,从0开始,依次加1
-
数组的长度
- 数组能存储数据的个数
- 它的值是数组的length属性的值
- length = 最大小标 + 1
-
-
一维数组的增删改查(遍历)->对数据的操作就这四种
- 增
- 数组一旦定义长度是无法改变的,无法新增数组了
- 删
- 数组一旦定义长度是无法改变的,无法真正删除数据,只能将数据修改成初始值
- 改
- 重新赋值即可:数组名[下标] = 新值
- 查(各种查法)
-
遍历数组(查所有数据)
-
使用JDK提供的方法(拿来主义:万能的百度)
- Arrays类的toString(数组名称)方法,即可输出数组中所有数据
- Arrays类的toString(数组名称)方法,即可输出数组中所有数据
-
自己编码(还是提倡吧,有益大脑,实际开发就拿来主义吧!)
- 依次获取数组中的数据,对于这种重复性操作可以使用循环来完成
- 语法
-
-
找出极值(查最大值与最小值)
-
使用JDK提供的方法(拿来主义:万能的百度)
Arrays.steam(数组名).max()或.min().getAsInt()
Arrays.sort(数组名);然后根据下标找极值,缺点是"改变了数组中元素顺序"
-
自己编码(先假定数组中下标为0的为极值,然后依次与其它数比较,找到真正极值后重新赋值给变量即可)
-
-
排序(升序)
-
使用JDK提供的方法(拿来主义:万能的百度)
Arrays.sort(数组名称),需要导入java.util.Arrays
-
自己编码
选择排序(选择数组中第一个数,然后依次与后面的数比较,把最小的放前面,最大放后面)
冒泡排序(相信元素比较,小的排前,大的排后)
![](https://images2018.cnblogs.com/blog/1009428/201808/1009428-20180826151523112-1052283852.png)
-
-
反转(降序)
-
如此简单,没有API,自己写吧
- 使用循环从一个数组中取出,然后写入另一个数组中,注意下标的变换(有两种写法)
- 使用循环从一个数组中取出,然后写入另一个数组中,注意下标的变换(有两种写法)
-
如果,反转前是升序,那么反转后就是降序了
-
-
查找数组中某元素的下标(某元素是否存在)
-
使用API(是排序后的下标,但是可以排序是否存在该元素)
-
自己编码(使用循环依次遍历)
-
-
其它操作
- 将指定数组的指定范围复制到一个新数组。 包含起始位置但不包含结束位置
- Arrays.copyOfRange(int[] arr,int from,int to);它的返回值是一个数组
- 将指定数组的指定范围复制到一个新数组。 包含起始位置但不包含结束位置
-
- 增
-
一维数组的常见异常
-
ArrayIndexOutOfBoundsException:数组索引超出了边界异常,简洁点(数组下标越界)
- 根本原因:操作的数组没有此下标,但是你非要访问
-
NullPointException:空指针异常(空对象不再指向堆内存了)
-
-
二维数组定义语法(二维数组本质也是一维数组,底层按一维数组处理的)
-
先声明后赋值
-
声明并赋值
1)
-
-
二维数组的基本特征
- 矩阵记录数据(当然实际上在内存中还是线型,这样是方便理解)
1) - 外层数组下标与lenght,内层每一个数组的下标与length(理解同一维数组)
- 下标
1. - 数组长度
1.
- 下标
- 矩阵记录数据(当然实际上在内存中还是线型,这样是方便理解)
-
二维数组的增删改查(遍历)
- 增
- 数组一旦定义长度是无法改变的,无法新增数组了
- 删
- 数组一旦定义长度是无法改变的,无法真正删除数据,只能将数据修改成初始值
- 改
- 重新赋值即可:数组名[外层下标][内层下标] = 新值
- 查(所有操作都是转换成一维数组后来实现的:外面多加一个循环即可)
- 遍历数组(查所有数据)
- 使用JDK:还能使用toString()而是使用deepToString()
1. - 自己编码
1.
- 使用JDK:还能使用toString()而是使用deepToString()
- 找极值,排序,反转,查找
- 都是将二维数组转换成一个个一维数组中然后进行操作的
- 遍历数组(查所有数据)
- 增
-
总结
- 如果只知道数组的长度,可以使用先声明的方式定义数组,此时数组中存储的数据根据类型有相应的默认值
- 数组的操作离不开循环(数组本身就是重复性存储数据的)
- 解决问题可采用降维方式,思考问题可采用多维方式
- 把二维数组的操作,转换成一维问题来解决
- 一维数组搞不定的问题,可尝试用多维数组来解决
- java也有3维,4维数组,但是实际用处不大(理论是无止境的)
1)
-