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
就是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++;
}
- 图解
源码用的是尾插法:
插入前:
插入后:
这是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链接起来,此时,链表是一个完整的链表。