数据结构(数组和链表)
1.数组
注意:这里的数组和js中的数组不一样;
数组是一整块连续的内存空间,它由固定数量的元素组成;
1.特点:
1.整个数组占用的内存空间是连续的;
2.数组中元素的数量是固定的(不可增加也不可减少),创建数组时就必须指定其长度;
3.每个元素占用的内存大小是完全一样的;
4.通过下标寻找对应元素效率极高,因此遍历速度快;
5.无法添加和删除数据,虽然可以通过某种算法完成类似操作,但是会增加额外的内存开销;
6.如果数组需要空间很大,可能一时无法找到足够大的连续空间;
js中的数组
ES6之前,没有真正意义的数组,所谓的Array,数组的基本特征不满足(内存空间不是连续的,数组中元素数量不是固定的,可以增加也可以减少,并且每一个元素占用的内存空间大小不是完全一样的),实际上底层实现是链表;
ES6之后,出现真正的数组(类型化数组),但是由于只能存储数字,功能有限;
目前来讲,js语言只具备不完善的数组(类型化数组);
类型化数组(具备真正数组的特点)
例如:var arr = new Int8Array(10)
数组要进行初始化,里边元素都为0;
2.链表
为了弥补数组缺陷而出现的一种数据结构,它具备的特点:
1.每个元素除了存储数据,需要有额外的内存存储一个引用(地址),来指向下一个元素;
2.每个元素占用的内存空间并不要求是连续的;
3.往往使用链表的第一个节点(根节点)来代表整个链表;
4.长度是可变的,随时可以增加和删除元素;
例如: 增加数据(在内存中申请一份内存空间,如果在bc节点之间增加,就把b的地址指向d,然而d的地址指向c,就可以了);删除d节点(直接把b的地址指向c就可以了)
5.插入和删除元素效率极高;
6.由于要存储下一个元素的地址,会增加额外的内存开销;
7.通过下标查询链表中的某个节点,效率会很低,所以链表的下标遍历效率很低;
**注意:**在js中,尽量不要使用for循环遍历数组(如:arr[66]底层是链表,从第一项查找找到低66项,每一次查找都是从第一项开始查找,效率很低),可以是for-each 和for-of来实现遍历,使用的是迭代方式