• JDK 1.8源码阅读 LinkList


    一,前言  

      LinkedList是一个实现了List接口和Deque接口的双端链表。有关索引的操作可能从链表头开始遍历到链表尾部,也可能从尾部遍历到链表头部,这取决于看索引更靠近哪一端。 LinkedList不是线程安全的。

    二,LinkList结构

      LinkList内部是一个双向列表的结构,如下图所示。

      

    三,LinkList源码阅读

      3.1 LinkList的继承关系

         

       从继承关系可以看出,LinkedList不但继承了List接口同时也继承了Queue接口。

      3.2 LinkedList的构造方法

    public LinkedList() {} // 空参构造
    
    public LinkedList(Collection<? extends E> c) {
          this();
          addAll(c);
    } // 带参构造,传入一个集合对象

      3.3 LinkedList的常用方法

    public E getFirst() {}  // 获取第一个元素
    
    public E getLast() {} // 获取最后一个节点元素
    
    public E removeFirst() {} // 删除最开始节点元素,并将改元素返回
    
    public E removeLast() {} // 删除最后节点元素,并将改元素返回
    
    public void addFirst(E e) {} // 最前面添加节点元素
    
    public void addLast(E e) {} //添加最后节点元素
    
    public boolean contains(Object o) {} // 判断元素是否存在
    
    public int size() {} // 返回集合长度
    
    public boolean add(E e) {} // 最末尾添加
    
    public boolean remove(Object o) {} // 最末尾删除
    
    public boolean addAll(Collection<? extends E> c) {} // 将一个集合添加到Linkedlist
    
    public boolean addAll(int index, Collection<? extends E> c) {} // 指定索引位置后开始添加集合
    
    public void clear() {} // 清空
    
    // Positional Access Operations
    
    public E get(int index) {} // 更具索引获取数据
    
    public E set(int index, E element) {} // 将指定位置的数字进行替换
    
    public void add(int index, E element) {} // 指定索引添加
    
    public E remove(int index) {} // 删除指定索引位置数据
    
    // Search Operations
    
    public int indexOf(Object o) {} // 返回指定元素的索引
    
    public int lastIndexOf(Object o) {} // 最后一次出现该元素的索引
    
    // Queue operations. 队列方式,增删更快
    
    public E peek() {} // 返回第一个,该方法笔者测试了感觉没什么用,可能没有理解深刻。
    
    public E element() {} // 返回第一个元素
    
    public E poll() {} // 返回和删除第一个元素
    
    public E remove() {} // 返回和删除第一个元素
    
    public boolean offer(E e) {} // 最后面添加元素
    
    public boolean offerFirst(E e) {} // 开始添加元素
    
    public boolean offerLast(E e) {} // 最后添加元素
    
    public E peekFirst() {} // 返回第一个
    
    public E peekLast() {} // 返回最后一个
    
    public E pollFirst() {} // 返回和删除第一个元素
    
    public E pollLast() {} // 返回和删除最后元素
    
    public void push(E e) {} // 前面添加
    
    public E pop() {} // 删除并返回第一个
    
    public boolean removeFirstOccurrence(Object o) {} // 删除第一个
    
    public boolean removeLastOccurrence(Object o) {} // 删除最后一个
    
    public ListIterator<E> listIterator(int index) {} 
    
    
    /**
     * @since 1.6
     */
    public Iterator<E> descendingIterator() {} // 转换迭代对象
    
    public Object clone() {} // 复制一个
    
    public Object[] toArray() {} // 转化成数组
    
    @SuppressWarnings("unchecked")
    public <T> T[] toArray(T[] a) {}
    
    
    /**
     * @since 1.8
     */
    @Override
    public Spliterator<E> spliterator() {}

      从方法中发现,有很多相同功能的方法,但是在效率上会有一定的差别。用队列的方式进行添加效率更高。

    四,总结 

      LinkedList是基于双端链表的List,其内部的实现源于对链表的操作,所以适用于频繁增加、删除的情况;该类不是线程安全的;另外,由于LinkedList实现了Queue接口,所以LinkedList不止有队列的接口,还有栈的接口,可以使用LinkedList作为队列和栈的实现。

  • 相关阅读:
    当使用了相对路径 <base href="<%= basePath %>" /> 后,全局都只能使用相对路径
    springmvc controller转发setViewName时找不到路径的问题以及转发视图时出现找不到样式的问题
    springmvc 使用jq传递json数据时出现415错误
    eclipse
    渗透测试记录
    在CentOS上安装Mysql使用yum安装mysql
    centos 安装 jdk
    wget和curl方式下载JDK
    Python程序的首行
    打印标准目录
  • 原文地址:https://www.cnblogs.com/tashanzhishi/p/10617061.html
Copyright © 2020-2023  润新知