LinkedList 是有序并且可以元素重复的集合,底层是基于双向链表的。
源码分析
构造方法
![](https://img.haomeiwen.com/i1734538/ace6bc459749488d.png)
构造方法一个是默认的,另外一个是传入一个集合,然后调用 addAll 方法添加集合所有的元素
Node
![](https://img.haomeiwen.com/i1734538/9b51c6ee772c83d8.png)
每个节点都包含了前一个节点 prev 以及后一个节点 next ,item 就是要当前节点要存储的元素
add方法
在 linkLast(E e) 中,先去判断了原来的尾节点是否为空。如果尾节点是空的,那么就说明原来的列表是空的。会将头节点也指向该元素;如果不为空,直接在后面追加即可。其实在 first 之前,还有一个为 null 的 head 节点。head 节点的 next 才是 first 节点。
add重载方法add(int index, E element)
node方法
linkBefore方法
addAll方法
![](https://img.haomeiwen.com/i1734538/7e2b0109efabc695.png)
addAll(int index, Collection c) 其实就是相当于多次进行 add(int index, E element) 操作,在内部循环添加到链表上。
get方法
![](https://img.haomeiwen.com/i1734538/8f49fdc03f1bd3e8.png)
在内部调用了 node(index) 方法,而 node(index) 方法在上面已经分析过了。就是判断在前半段还是在后半段,然后遍历得到即可。
remove 方法
![](https://img.haomeiwen.com/i1734538/60b11d6e68dae7d2.png)
remove(int index) 中调用了 unlink(Node x) 方法来移除该节点
![](https://img.haomeiwen.com/i1734538/349e30f511e77002.png)
remove(Object o) 的代码就是遍历链表,然后得到相等的值就把它 unlink(x) 了。
set方法
clear方法
网友评论