LinkedList是非线程安全双向链表式集合
优点:所以它的插入和删除操作比 ArrayList 更加高效。
缺点:但也是由于其为基于链表的,所以随机访问的效率要比 ArrayList 差。
通过上图可以看出LinkedList是可clone,可被序列化的双向链表集合.
LinkedList实现双向链表是根据自己内部类,通过这个类可以实现双向链表结构
对集合我们操作无外乎添加,删除,获取,清空(GC),我们接下来就根据源码来看下经常使用的实现方式
add(E e):
添加原理:当第一次添加的时候last以及first都为null,那么这时候添加第一个的时候只有创建的第一个链表last就形成了<null,e,null>,在第二次的时候l.next就开始记录下一个(last = newNode;),并且对上一个的next记录为当前的数据(l.next = newNode;);这样就形成了一个循环.
获取原理:首先是先检测索引值是否超出size,其次就是从链表中取得了,取得的时候是要判断是从链表前→后,还是后→前取,这个是根据index和size/2相比较,哪边比较少就证明从这边取得的速度比较快.
但是这个快也是相对而言,不像arrayList数组根据索引直接取得来的快,如果数据量很大的情况下,那么不管从前往后取还是从后往前取,都是要遍历最多size/2次的,所以说linkedList访问效率比较差.
remove(int index)
删除原理:首先根据index取得该Node,然后将Node的next对应的prev设置为Node的prev对应的next.(prev.next = next;),并且还判断了是否remove的是第一个还是最后一个
clear()
将所有节点都设置为null,这样有助于GC垃圾清理.