源码分析——LinkedList的add和get方法原理分析

Posted 喵喵7781

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了源码分析——LinkedList的add和get方法原理分析相关的知识,希望对你有一定的参考价值。

Linked的add方法

    /**
     * Appends the specified element to the end of this list.
     *
     * <p>This method is equivalent to @link #addLast.
     *
     * @param e element to be appended to this list
     * @return @code true (as specified by @link Collection#add)
     */
    public boolean add(E e) 
        linkLast(e);
        return true;
    

     /**
     * Links e as last element.
     */
    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++;
    

1.初始化并添加第一个元素:last=null,则新创建一个Node节点,并赋值给first节点。

2.添加第二个元素:last有值,newNode赋值给last和l.next,新节点变成旧节点的后继节点。例子如下图:

 

LinkdedList的get方法

   /**
     * Returns the element at the specified position in this list.
     *
     * @param index index of the element to return
     * @return the element at the specified position in this list
     * @throws IndexOutOfBoundsException @inheritDoc
     */
    public E get(int index) 

        //1.判断数组是否越界
        checkElementIndex(index);

        //2.返回查找值
        return node(index).item;
    
    
    private void checkElementIndex(int index) 
        if (!isElementIndex(index))
            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
    

     /**
     * Returns the (non-null) Node at the specified element index.
     */
    Node<E> node(int index) 
        // assert isElementIndex(index);

        if (index < (size >> 1)) 
            Node<E> x = first;
            for (int i = 0; i < index; i++)
                x = x.next;
            return x;
         else 
            Node<E> x = last;
            for (int i = size - 1; i > index; i--)
                x = x.prev;
            return x;
        
    

1.判断数组是否下标越界

2.查找获取值:如果index<(size>>1)则从头部开始查找;否则,从尾部开始查找。

假设index=2,size=7,则size>>1=3,index<3,所以从头部开始查找。如果index=4,则index>3,则从尾部开始查找。

 

LinkdedList的getFirst方法

 /**
     * Returns the first element in this list.
     *
     * @return the first element in this list
     * @throws NoSuchElementException if this list is empty
     */
    public E getFirst() 
        final Node<E> f = first;
        if (f == null)
            throw new NoSuchElementException();
        return f.item;
    

因为内存中存有first和last节点的值,所以直接从节点里面获取item属性即可。

以上是关于源码分析——LinkedList的add和get方法原理分析的主要内容,如果未能解决你的问题,请参考以下文章

LinkedList add get 源码解析

LinkedList详细分析

LinkedList源码分析(超详细)

LinkedList源码分析(超详细)

LinkedList源码分析(超详细)

Java Review - LinkedList源码解读