数据结构特性解析 (一) 数组

前言

数组是java中最基本的数据结构,有很多更高级的数据接口实现方式都是使用的数组,所以了解数组是很重要的

描述

数组是一个对象,内部有一块连续的内存,自身只占用很小的内存,其他位置都是根据长度和类型而分配的值对象或者引用值对象

特点

1. 数组长度在初始化时确定且无法修改

由上图可见,数组并没有add或修改长度的方法

2.数组每个位置所占的内存大小是在初始化时固定的

组中存储对象都是存储的其引用值,在同一个环境下(32位一般4个字节,64位4到8个字节)引用值的大小都是一样的,因此对象数组每个位置所占的内存大小也是一样的

而由于64位地址比32位地址更大,所以在64位环境下,对象数组也会比32位环境下占用的空间更大

果存储的是基本类型的话,则每个位置所占用的大小都是该基本数据类型的大小

ps:基本数据占用内存大小:https://blog.csdn.net/ccw0054/article/details/79082679

3.数组是一个创建在堆内存中的对象,并且内存占用是连续的

由于数组的前两个特性,因此被设计为内存连续的,这样查找速度更快(因为每个位置大小固定,并且位置连续,所以只需要通过向阵列头部的地址添加合适的偏移来找到需要的内存地址)

但是这样的设计也会使新建大数组时寻找不到合适的内存空间(有可能空间足够,但不是连续的)而引发内存重排序(gc?)?  有待考究

图示(由于堆的特性和对象自动回收,很有可能会出现下面图示的情况):

如上图,想创建一个长度为5的数组,可是堆内存中并没有一块连续的长度够的内存,因此可能会引发内存重排序(gc?)?,然后使内存整齐,并腾出足够的连续的空间,可以创建出对应的数组,因此数组也是一个对内存要求严格的数据结构

4.数组随机查找比较快

因为特性3,数组根据索引的方式去查找数据,会比较快,不用进行循环或多次寻址

而遍历查询则需要遍历索引来循环从数组中取出

5.数组支持嵌套

比如:  int[][] ints =new int[10][10];//一个10*10的二维数组

取用第一层数组的第5个里的第1个:  int i = ints[4][0];

ps:也支持多层嵌套,叫做n维数组,因为平时用不到,所以就不写了

如有错误或补充,请各位大佬指出,我会尽快修改

发布了42 篇原创文章 · 获赞 192 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_33505109/article/details/91384890