LinkedList
一、简介
LinkedList同时实现了List接口和Deque接口,也就是既可以把它看作一个顺序容器,又可以看作一个队列(Queue),同时又可以看作一个栈(stack),这样看来,linkedList简直就是无敌的,当你需要使用栈或者队列时,可以考虑用LinkedList,一方面是因为Java官方已经声明不建议使用Stack类,更遗憾的是,Java里根本没有一个叫做Queue的类(只是一个接口的名字)。关于栈或队列,现在首选是ArrayDeque,它有着比LinkedList(当作栈或队列使用时)更好的性能。
二、常用方法
方法名 用法 描述 add 引用.add(元素); 将指定的元素追加到此列表的末尾。 add(int index, E element) 引用.add(index, 元素); 在此列表中的指定位置插入指定的元素 addAll Conllections.addAll 按照指定集合的迭代器返回的顺序将指定集合中的所有元素追加到此列表的末尾。 addFirst 引用.addFirst(元素) 在该列表开头插入指定的元素。 addLast 引用.addLast(元素) 将指定的元素追加到此列表的末尾。 clear 引用.clear(); 从列表中删除所有元素。 contains 引用.contains(元素) 如果此列表包含指定的元素,则返回 true get 引用.get(int index) 返回此列表中指定位置的元素。 getFirst 引用.getFirst 返回此列表中的第一个元素。 getLast 引用.getLast 返回此列表中的最后一个元素。 indexOf 引用.indexOf 返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。 lastIndexOf 引用.lastIndexOf 返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1。 contains 引用.contains 判断集合中是否有指定集合(判断包含关系) isEmpty 引用.isEmpty 判断集合中是否没有元素 remove 引用.remove(元素) 依据元素删除元素 remove 引用.remove(index) 依据下标删除元素 removeAll 引用.removeAll 去除交集 retainAll 引用.retainAll 保留交集
三、手撕底层源码
public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable { //操作数 protected transient int modCount = 0; transient int size = 0;//相当于指针 transient Node<E> first;//第一个结点 -- null transient Node<E> last;//最后一个结点 -- null //无参构造 public LinkedList() { } //有参构造 public LinkedList(Collection<? extends E> c) { this(); addAll(c); } //add方法的底层 public boolean add(E e) { linkLast(e); return true; } void linkLast(E e) { final Node<E> l = last; final Node<E> newNode = new Node<>(l, e, null); last = newNode; if (l == null) first = newNode; else l.next = newNode; size++; modCount++; } //节点类 private static class Node<E> { E item; ------- 元素 Node<E> next; - 下一个节点地址 Node<E> prev; - 上一个节点地址 Node(Node<E> prev, E element, Node<E> next) { this.item = element; this.next = next; this.prev = prev; } } public boolean addAll(Collection<? extends E> c) { return addAll(size, c); } }
LinkedList<String> list = new LinkedList<>(); list.add("孙悟空"); list.add("猪八戒"); list.add("沙和尚"); list.add("小哪吒"); list.add("二郎神");
总结
LinkedList底层数据结构为双向链表
ArrayList vs LinkedList
ArrayList 的应用场景:存储数据(如果要存的数据没有特殊要求,就使用ArrayList)
LinkedList 的应用场景:队列模式、栈模式
效率区别:
ArrayList 数据结构:一维数组(一维数组开辟的空间是连续的)
LinkedList数据结构:双向链表(双向链表就是一个一个的对象,内存空间不是连续的)
添加 - 不扩容:ArrayList快
添加 - 扩容:LinkedList快
删除:LinkedList快
修改:ArrayList快(因为修改之前需要查询到某个元素)
查询:ArrayList快
在处理业务中,多使用ArrayList,因为业务中的查询是最多的