LinkedList

LinkedList

  • public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, Serializable

    双链表实现了ListDeque接口。实现所有可选列表操作,并允许所有元素(包括null )。

    所有的操作都能像双向列表一样预期。 索引到列表中的操作将从开始或结束遍历列表,以更接近指定的索引为准。

    请注意,此实现不同步。 如果多个线程同时访问链接列表,并且至少有一个线程在结构上修改列表,则必须在外部进行同步。 (结构修改是添加或删除一个或多个元素的任何操作;仅设置元素的值不是结构修改。)这通常通过在自然封装列表的对象上进行同步来实现。 如果没有这样的对象存在,列表应该使用Collections.synchronizedList方法“包装”。 这最好在创建时完成,以防止意外的不同步访问列表:

      List list = Collections.synchronizedList(new LinkedList(...)); 

    这个类的iteratorlistIterator方法返回的迭代器是故障快速的 :如果列表在迭代器创建之后的任何时间被结构化地修改,除了通过迭代器自己的removeadd方法之外,迭代器将会抛出一个ConcurrentModificationException 。 因此,面对并发修改,迭代器将快速而干净地失败,而不是在未来未确定的时间冒着任意的非确定性行为。

    请注意,迭代器的故障快速行为无法保证,因为一般来说,在不同步并发修改的情况下,无法做出任何硬性保证。 失败快速迭代器尽力投入ConcurrentModificationException 。 因此,编写依赖于此异常的程序的正确性将是错误的:迭代器的故障快速行为应仅用于检测错误。

    LinkedList的特点:

    1、底层是一个链表结构,查询慢、增删快。

    2、里面包含了大量操作首尾元素的方法。

    • booleanadd(E e) 将指定的元素追加到此列表的末尾。
      void add(int index, E element) 在此列表中的指定位置插入指定的元素。
      boolean addAll(Collection c) 按照指定集合的迭代器返回的顺序将指定集合中的所有元素追加到此列表的末尾。
      boolean addAll(int index, Collection c) 将指定集合中的所有元素插入到此列表中,从指定的位置开始。
      void addFirst(E e) 在该列表开头插入指定的元素。
      void addLast(E e) 将指定的元素追加到此列表的末尾。
      void clear() 从列表中删除所有元素。
      Object clone() 返回此 LinkedList的浅版本。
      boolean contains(Object o) 如果此列表包含指定的元素,则返回 true
      Iterator descendingIterator() 以相反的顺序返回此deque中的元素的迭代器。
      E element() 检索但不删除此列表的头(第一个元素)。
      E get(int index) 返回此列表中指定位置的元素。
      E getFirst() 返回此列表中的第一个元素。
      E getLast() 返回此列表中的最后一个元素。
      int indexOf(Object o) 返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。
      int lastIndexOf(Object o) 返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1。
      ListIterator listIterator(int index) 从列表中的指定位置开始,返回此列表中元素的列表迭代器(按适当的顺序)。
      boolean offer(E e) 将指定的元素添加为此列表的尾部(最后一个元素)。
      boolean offerFirst(E e) 在此列表的前面插入指定的元素。
      boolean offerLast(E e) 在该列表的末尾插入指定的元素。
      E peek() 检索但不删除此列表的头(第一个元素)。
      E peekFirst() 检索但不删除此列表的第一个元素,如果此列表为空,则返回 null
      E peekLast() 检索但不删除此列表的最后一个元素,如果此列表为空,则返回 null
      E poll() 检索并删除此列表的头(第一个元素)。
      E pollFirst() 检索并删除此列表的第一个元素,如果此列表为空,则返回 null
      E pollLast() 检索并删除此列表的最后一个元素,如果此列表为空,则返回 null
      E pop() 从此列表表示的堆栈中弹出一个元素。
      void push(E e) 将元素推送到由此列表表示的堆栈上。
      E remove() 检索并删除此列表的头(第一个元素)。
      E remove(int index) 删除该列表中指定位置的元素。
      boolean remove(Object o) 从列表中删除指定元素的第一个出现(如果存在)。
      E removeFirst() 从此列表中删除并返回第一个元素。
      boolean removeFirstOccurrence(Object o) 删除此列表中指定元素的第一个出现(从头到尾遍历列表时)。
      E removeLast() 从此列表中删除并返回最后一个元素。
      boolean removeLastOccurrence(Object o) 删除此列表中指定元素的最后一次出现(从头到尾遍历列表时)。
      E set(int index, E element) 用指定的元素替换此列表中指定位置的元素。
      int size() 返回此列表中的元素数。
      Spliterator spliterator() 在此列表中的元素上创建late-binding故障快速 Spliterator
      Object[] toArray() 以正确的顺序(从第一个到最后一个元素)返回一个包含此列表中所有元素的数组。
      T[] toArray(T[] a) 以正确的顺序返回一个包含此列表中所有元素的数组(从第一个到最后一个元素); 返回的数组的运行时类型是指定数组的运行时类型。
public class MyLinkedList {
   public static void main(String[] args) {
       LinkedList<String> linkedList = new LinkedList<>();
       boolean b = linkedList.isEmpty();
       System.out.println(b);
       linkedList.add("a");
       linkedList.add("b");
       linkedList.add("c");
       linkedList.add("d");
       System.out.println(linkedList);

       linkedList.addFirst("A");
       linkedList.addLast("D");
       System.out.println(linkedList);

       //push(E e)` 将元素推送到由此列表表示的堆栈上。效果与addFirst类似。
       linkedList.push("www");
       System.out.println(linkedList);

       String first = linkedList.getFirst();
       System.out.println(first);

       String last = linkedList.getLast();
       System.out.println(last);

       linkedList.removeFirst();
       linkedList.removeLast();
       System.out.println(linkedList);

       //pop()` 从此列表表示的堆栈中弹出一个元素。相当于removeFirst()
       String pop = linkedList.pop();
       System.out.println(pop);
       System.out.println(linkedList);
  }
}
原文地址:https://www.cnblogs.com/lxy522/p/12820110.html