LinkedList
相比较ArrayList,它的查找效率较差,但是增删效率比较好!
1. LinkedList的定义
从这段代码中我们可以清晰地看出LinkedList继承AbstractSequentialList,实现List、Deque、Cloneable、Serializable。其中AbstractSequentialList提供了 List 接口的骨干实现,从而最大限度地减少了实现受“连续访问”数据存储(如链接列表)支持的此接口所需的工作,从而以减少实现List接口的复杂度。Deque一个线性 collection,支持在两端插入和移除元素,定义了双端队列的操作。LinkedList是基于双向链表来实现的!
2. LinkedList源码分析
打开构造函数:
它在内存中的模型:
增加方法:
add(E e): 将指定元素添加到此列表的结尾。
Entry和Node是一样的,都是节点的意思
在addBefore方法中无非就是做了这件事:构建一个新节点newEntry,然后修改其前后的引用(结合上图看)
add(int index, E element):在此列表中指定的位置插入指定的元素。
addAll(Collection<? extends E> c):添加指定 collection 中的所有元素到此列表的结尾,顺序是指定 collection 的迭代器返回这些元素的顺序。
addAll(int index, Collection<? extends E> c):将指定 collection 中的所有元素从指定位置开始插入此列表。
AddFirst(E e): 将指定元素插入此列表的开头。
addLast(E e): 将指定元素添加到此列表的结尾
移除方法:
remove(Object o):从此列表中移除首次出现的指定元素(如果存在)
删去王五:
LinkedList是把Node(包含Person)从链表的移出(通过修改上下节点的引用来实现),ArrayList删除底层数组元素后又把底层数组都往前复制了一格内容,时间复杂度ArrayList底层数组删除元素时间复杂度为O(n),而LinkedList底层链表删除元素只是简单的修改了一下引用地址,时间复杂度为O(1)。
所以ArrayList的读写较快,增删较慢,LinkedList的读写较慢,增删较快!
LinkedList可以简单理解为数据结构中的链表(说简单理解,因为其实是双向循环链表),在内存中开辟的不是一段连续的空间,而是每个元素有一个[元素|下一元素地址]这样的内存结构。当
get(index)时,只能从首元素开始,依次获得下一个元素的地址。
用时间复杂度表示的话,ArrayList的get(n)是o(1),而LinkedList是o(n)。