数组
注意
:这里的数组和JavaScript中数组不一样,这里数组指的是一种数据结构,js数组是js中的一个Array对象,数据结构中的数组更加接近于C中的数组
数组是一块连续的内存空间,它由固定数量的元素组成
特点:
- 整个数组占用的
内存空间
是连续的 - 数组中元素的数量是固定的(不可增加也不可减少),创建数组时就必须指定其长度
- 每个元素占用的内存大小是完全一样的
- 通过下表寻找对应元素效率极高,因此遍历速度快
- 无法添加和删除数据,虽然可以通过某种算法完成类似操作,但是会增加额外的内存开销
- 如果数组需要的空间很大,可能一时无法找到足够大的连续空间
JavaScript中的数组
ES6之前,没有真正意义的数组,所谓Array,数组的基本特质不满足(内存空间不是连续的,数组元素数量不固定,可以增加也可以减少,并且每一个元素占用的内存空间大小并不是完全一样的),实际上底层实现是链表
ES6之后,出现真正的数组(类型化数组),但是由于只能存储数字,功能有限
目前来讲,js语言只具备不完善的数组(类型化数组)
类型化数组
(具备真正数组的特点)
例如:
var arr = new Int8Arrary(10)
数组要进行初始化,里面元素都是0 类型化数组没有push、splice等方法
但是,chrome v8引擎,对数组进行了优化,目前,js数组,基本上都是真正的数组; v8引擎 让数组的每个元素固定占用32位的空间(4个字节);
- 针对数字:如果数字超过32位,转换为Double对象;
- 针对对象:存储32位的地址;
- 针对字符串:封装成字符串对象;
- 针对布尔类型:只占用1位(0或1);
链表
为了弥补数组缺陷而出现的一种数据结构,它具备的特点
- 每个元素出了存储数据,需要额外的内存存储一个引用(地址),来指向下一个元素
- 每个元素占用的内存空间并不要求是连续的
- 往往使用链表的第一个节点(根节点)来代表整个链表
- 长度是可变的,随时可以增加和删除元素 例如: 增加数据(在内存中申请一份内存空间,如果在bc之间增加一个节点,就把b的地址指向d,d再指向c) 删除数据(删除d节点,把b指向c)
- 插入和删除元素效率极高
- 由于要存储下一个元素的地址,会增加额外的内存开销
- 通过下标查询链表中的某个节点,效率会很低,所以链表的下标遍历效率很低
以上内容参考自CSDN 沐浴
老哥