1.数组的概念
数组的实现是批量初始化存储空间,在连续的相同结构的存储单元中使用下标定位要操作的位置。数组是引用数据类型,数组变量储存的是这个连续的存储空间的起始位置,下标是从0开始计数的int型数据。
例如:
/*数组的一种创建方式:数据类型[] 数组名 = {数组中存放的数据}*/
int[] array = {1,2,3,4,5};
/*示例数组中array[0] = 1,array[1] = 2 … array[4] = 5*/
数组是一种是计算偏移量寻址的结构,如同路灯,知道路灯间的距离,可以计算出后面第几个路灯距离多远。数组的地址就是起点,通过计算偏移一定数量后,就能获得元素。
数组的应用有多种思路,基础用法就是用数组存储相同维度的数据。利用下标数值,提供存储读取功能。除此之外可以让多个数组的相同下标存储对同一事物不同维度的描述信息。比如姓名数组,年龄数组,生日数组,都使用第三个位置(下标2)存储张三的各项信息。这种存储方式称为列存储,这种下标使用方式称为数组下标映射。除了上述简单的一对一映射,未来还要学习更多映射方式,这些都是数组技术的应用。
2.行式存储和列式存储
行式存储(强调的是数据间的关系,适用于面向对象):
优点:添加删除一个事物数据成本低,访问特定事物的各维度信息成本低。
缺点:读取数据时,和搜索不相关的数据也会被检索出来。
列式存储(强调不同事物的同一维度,适用于数据分析):
优点:查询时只有涉及到的列会被读取,投影(映射)很高效,任何列都能作为索引。
缺点:选择完成时,被选择的列要重新组装,增加删除数据时成本高。
以下表为例:
张三 | 手机号1 | 男 | 北京 |
李四 | 手机号2 | 女 | 上海 |
王五 | 手机号3 | 男 | 广州 |
小明 | 手机号4 | 男 | 天津 |
小红 | 手机号5 | 女 | 重庆 |
小张 | 手机号6 | 女 | 香港 |
行式存储:
{“张三”,”手机号1”,”男”,”北京”}
{“李四”,”手机号2”,”女”,”上海”}
{“王五”,”手机号3”,”男”,”广州”}
{“小明”,”手机号4”,”男”,”天津”}
{“小红”,”手机号5”,”女”,”重庆”}
{“小张”,”手机号6”,”女”,”香港”}
列式存储:
[“张三”,“李四”,“王五”,“小明”,“小红”,“小张”]
[“手机号1”,“手机号2”,“手机号3”,“手机号4”,“手机号5”,“手机号6”]
[“男”,“女”,“男”,“男”,“女”,“女”]
[”北京”,”上海”,”广州”,”天津”,”重庆”,”香港”,]
3.数组的声明
声明数组包括:①数组的名字②数组包含的元素的数据类型,声明的数组默认值是null(空)
1.数组元素类型[ ] 数组名; int[ ] a;
2.数组元素类型 数组名[ ]; int a[ ];
[ ]写在标识符前面是正规写法,Java支持了c++的编写风格,所以允许写在标识符后面。
例如:
float boy[ ]; double[ ] girl;
char cat[ ]; char[ ] dog;
4.数组的初始化
与声明合并,有两种方式:
①int[ ] a = {1,2,3,4,5};
[ ]表示要声明一个int类型的数组,命名为a,初始化长度为5,里面的元素分别为1,2,3,4,5.
②int[ ] b=new int[10];
[ ]表示要声明一个int类型的数组,命名为b,初始化长度为10,里面的元素是元素类型的默认值。
两种方式目的都是确定数组的存储长度,只不过第一种确定存储长度的同时,确定存储的内容。
5.二维数组及多维数组
二维数组常用于矩阵及线性方程组计算中,举例:
int[][] array = {{1,2,3},{4,5,6},{7,8,9}};
这种数组分析时可以逐层去壳,去掉第一层外壳后,剩余:
{1,2,3},{4,5,6},{7,8,9}
可以看出第一层的数组中的元素是数组。
可能有点绕口,我们这么理解,A={1,2,3},B={4,5,6},C={7,8,9},那么数组array可以写成{A,B,C},是不是清楚一点啦?
多维数组即是在二维数组的基础上,把每个二维数组当做新数组的元素并存放至一个三维数组中,以此类推至n维数组,但是一般业务环境中三维数组也很罕见,更高维的数组极少极少用到。