首先,我们都知道数组的特点是查询快,增删慢,链表是增删快,查询慢。为什么呢?
数据结构特点
- 数组
- 数组是具有相同的数据类型且按一定次序排列的一组变量的集合体,数组的内存地址是连续的
- 数组可以随机度,找到第一个元素的首地址,再加上每个元素的字节大小,就能定位到对应的元素
- CPU缓存会把一片连续的内存空间读入,因为数组结构是连续的内存地址,所以数组全部或者部分元素被连续存在CPU缓存里面
- 链表
- 链表是不连续的,每个链表的节点包括原来的内存和下一个节点的信息(单向链表含下一个节点,双向链表含前后两个)
- 链表的节点是分散在堆空间里面的,只能是去读取内存不能从CPU缓存中读,而缓存的速率要比内存快。
这次我是真的用心在画图
读写差异
寻址操作次数链表要多一些。
数组只需对[首地址+元素大小*k]就能找到第k个元素的地址,对其取地址就能获得该元素。
链表要获得第k个元素,首先要在其第k-1个元素寻找到其next指针偏移,再将next指针作为地址获得值,这样就要从第一个元素找起,多了多步寻址操作,当数据量大且其它操作较少时,这就有差距了。
插入删除效率链表比数组高。
因为执行插入删除操作时,只需要操作引用即可,元素不需要移动元素,他们分布在内存的不同地方,通过引用来互相关联起来。
而数组需要移动所有后面的元素(除非是在最后一个位置插入或删除),故效率低。