ArrayList和LinkedList的算法实现和区别
来源:互联网 发布:网络建设与管理方案 编辑:程序博客网 时间:2024/05/20 02:21
ArrayList采用的是动态数组的数据结构,动态数组的数据结构原理如下所示:
这就是一个最基本的动态数组,pData记录了数组第一个元素的位置,Unit Size记录了每个元素的大小,(这样可以方便地找到第N个元素了)Unit Number记录了元素的数目。
获取数组中第N个元素,是很简单的,无需多说。
但已知某位置,要插入一个元素,就稍微有点难,因为要挪动一些元素,如图:
删除元素跟这个也类似,也是需要挪一挪后面的元素,只不过是往前挪。
数组的大小不能很方便地调整,需要几个步骤,如下图所示:
下图就是最简单最一般的单向链表:
还有这种:
多一个Tail指针,好处就是能很方便地找到末尾,然后在末尾插入新的元素什么的。还有这种也比较常见:
留一个终始标志,这个节点作为一个标志,不用于存储数据,链表末尾指向这个节点,形成一个“环形链表”,这样无论在链表的哪里插入新的元素,操作都一致了,不必判断头和尾的特殊性。
数组的好处就是链表的坏处,数组的坏处就是链表的好处,请看:
因为需要从头开始找,没办法像数组那样直接跳到那个地址。而插入元素,就比数组方便了,如果你已经得知了要插入的地址的话,不过还要注意哦,是“后插入”(Insert After):
有“后插入”,那就有“前插入”(Insert Before),两者对单向链表来说真的不一样,下图描述了“前插入”:
由于指针向后不向前,我们不知道要插入位置的前一个节点是什么,只能从头找,所以比较麻烦。至于链表大小的重新调整,和数组相比如何呢?呃……我可没说链表有大小限制吧?
总结:
综上的实现原理可以知道:
1、对于一般常用的get、set方法使用ArrayList的性能要明显优于LinkedList,因为LinkedList的。
2、对于插入和删除数据LinkedList要明显优于ArrayList,因为ArrayList要移动出入之后的所有数据的位置。
3、在扩容方面ArrayList的性能也要明显低于LinkedList
- ArrayList和LinkedList的算法实现和区别
- ArrayList和LinkedList底层实现的区别
- ArrayList和LinkedList底层实现的区别
- ArrayList和LinkedList底层实现的区别
- linkedlist和arraylist的区别
- ArrayList和LinkedList的区别
- ArrayList和LinkedList的区别
- ArrayList和LinkedList的区别
- ArrayList和LinkedList的区别
- ArrayList和LinkedList的区别
- arraylist和linkedlist的区别!
- LinkedList和ArrayList的区别
- LinkedList和ArrayList的区别
- LinkedList和ArrayList的区别
- ArrayList和LinkedList的区别
- ArrayList和LinkedList的区别
- LinkedList和ArrayList的区别
- ArrayList和LinkedList的区别
- poj 1458 Common Subsequence(lcs)
- Nmap扫描多网段时的坑
- 防守阵地 II
- leetcode31. Next Permutation
- 1058. 选择题
- ArrayList和LinkedList的算法实现和区别
- 一致性hash-java实现treemap版
- SpringMVC 学习 03 - spring mvc的获取参数和传递参数
- 关于mysql index
- 三色警示灯M4 ONLION内部电参数详解
- java.lang.Object cannot be resolved. It is indirectly referenced from
- GreeDao基础使用
- 工作里程之二,手机app里面的网页--WebView
- EasyUI总结(一)