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