数组概览
# 数组概览
数组(英语:Array),是由相同类型的元素(element)的集合所组成的数据结构,分配一块连续的内存来存储.
优点:随机访问:可以通过下标随机访问数组中的任意位置上的数据
缺点:对数据的删除和插入不是很友好
查找: 根据下标随机访问的时间复杂度为 O(1);
插入或删除: 时间复杂度为 O(n);
Chrome 浏览器 JS 引擎 V8 中,数组有两种存储模式,一种是类似 C 语言中的线性结构存储(索引值连续,且都是正整数的情况下),一种是采用 Hash 结构存储(索引值为负数,数组稀疏,间隔比较大)
JavaScript 中, JSArray 继承自 JSObject ,或者说它就是一个特殊的对象,内部是以 key-value 形式存储数据,所以 JavaScript 中的数组可以存放不同类型的值。它有两种存储方式,快数组与慢数组,初始化空数组时,使用快数组,快数组使用连续的内存空间,当数组长度达到最大时,JSArray 会进行动态的扩容,以存储更多的元素,相对慢数组,性能要好得多。当数组中 hole 太多时,会转变成慢数组,即以哈希表的方式( key-value 的形式)存储数据,以节省内存空间。
# 数组和链表的区别
概念:数组是一组固定数量的数据项,链表是包含可变数量的数据项的有序集
大小:数组的元素个数是固定的(声明时指定),而组成链表的结点个数可按需要增减(在执行期间成长和收缩);
存储分配:数组元素位置在编译期间分配,即静态内存分配,链表元素位置在运行时分配,即动态内存分配
元素顺序:数组连续存储,链表随机存储
访问元素:数组直接或随机访问(即指定数组索引或下标),链表顺序访问(即通过指针遍历),数组利用下标定位,时间复杂度为 O(1),链表定位元素时间复杂度 O(n);
插入和删除元素:数组在需要换挡时相对缓慢,链表更迅速,高效,数组插入或删除元素的时间复杂度 O(n),链表的时间复杂度 O(1)。
查找:数组二进制搜索或线性查找,链表线性查找
需要内存: 数组较少,链表更多
内存利用率:数组较低,链表高效