ArrayList和linkedlist的add方法

ArrayList和linkedlist的add方法

  • ArrayList和linkedlist都继承Collection和List接口.

Arraylist

  • transient Object[] elementData; // non-private to simplify nested class access(非私有以简化嵌套类访问)
public boolean add(E e) {
        ensureCapacityInternal(size + 1);  
        elementData[size++] = e;
        return true;
    }

add方法,总是返回true。
用数组elementData来保存,在此数组中保存至最后。

  • 图解 add
    enter description here
    就是ArrayList里面的elementData数组里面最后一个元素后面进行添加一个。

LinkList

public boolean add(E e) {
        linkLast(e);
        return true;
    }

也总是返回true。在linkLast中实现的是链表
List内部实现的双链表,lsat是最末位的元素,linkLast把元素连接到末位。

/**
     * Links e as last element.链接e作为最后一个元素。
     */
    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++;
    }
  • 图解
    源码用的是尾插法:
    插入前:
    enter description here
    插入后:
    enter description here
    这是Node表(类)
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;
        }
    }

源码尾插法解释:

  • 尾插法,就是在链表最末位添加表。
  • final Node l = last; 创建l 等于 链表中最后一个表last指向的位置。
  • final Node newNode = new Node<>(l, e, null); 创建新的表,上一个指向l,元素为e,因为是末位,所以下个是空
  • last = newNode; 此时last应该是新建的newNode了
  • if (l == null) 判断是不是空链表,
    first = newNode; 空链表,表头first也指向newNode
    else
  • l.next = newNode; l是开始保存last的位置,l.next与newNode链接起来,此时,链表是一个完整的链表。

posted on 2020-05-27 16:09  寄居の友人c  阅读(1655)  评论(0编辑  收藏  举报