size()返回结合中存储的节点数量
public int size() { return size; }
add(E e)向集合末尾添加一个元素
public boolean add(E e) { linkLast(e); return true; }
remove(Object o)移除一个元素
public boolean remove(Object o) { if (o == null) {//如果o是null for (Node<E> x = first; x != null; x = x.next) {//从第一个节点指针指向的节点开始循环 if (x.item == null) {//比较节点的值,的内存地址 unlink(x);//取消节点 return true;//操作成功 } } } else {//如果o是不是null for (Node<E> x = first; x != null; x = x.next) {//从第一个节点指针指向的节点开始循环 if (o.equals(x.item)) {//调用o的equals方法和节点的值作比较 unlink(x);//取消节点 return true;//操作成功 } } } return false;//操作失败 }
addAll(Collection<? extends E> c)向集合末尾加入集合c
public boolean addAll(Collection<? extends E> c) { return addAll(size, c); }
public void clear() { // Clearing all of the links between nodes is "unnecessary", but: // - helps a generational GC if the discarded nodes inhabit // more than one generation // - is sure to free memory even if there is a reachable Iterator for (Node<E> x = first; x != null; ) {//从first指针指向的节点开始循环 Node<E> next = x.next;//获取x的next x.item = null;//x的值置空 x.next = null;//x的next置空 x.prev = null;//x的prev置空 x = next;//x赋值为next下一次循环使用 } first = last = null;//第一个节点指针和最后一个节点的指针置空 size = 0;//数据长度0 modCount++;//操作数不清空 }
get(int index)获取index索引节点数据
public E get(int index) { checkElementIndex(index); return node(index).item; }
set(int index, E element)设置index索引处的节点位数为element
public E set(int index, E element) { checkElementIndex(index);//index在范围内 Node<E> x = node(index);//获取索引处的节点 E oldVal = x.item;//获取节点旧的值 x.item = element;//给节点的值赋值新值 return oldVal;//返回旧的值 }
add(int index, E element)根据索引插入数据
public void add(int index, E element) { checkPositionIndex(index);//index在范围内 if (index == size)/、如果索引位index等于数据长度 linkLast(element);//尾插入 else linkBefore(element, node(index));//否则插入在index索引对应节点之前 }
remove(int index)移除索引index处的数据
public E remove(int index) { checkElementIndex(index);//index在范围内 return unlink(node(index)); }
isElementIndex(int index)判断参数是否是现有元素的索引
private boolean isElementIndex(int index) { return index >= 0 && index < size; }
isPositionIndex(int index)判断参数是否是现有元素的索引(迭代器或添加操作)
private boolean isPositionIndex(int index) { return index >= 0 && index < size; }
private String outOfBoundsMsg(int index) { return "Index: "+index+", Size: "+size; } private void checkElementIndex(int index) { if (!isElementIndex(index)) throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); } private void checkPositionIndex(int index) { if (!isPositionIndex(index)) throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); }
lastIndexOf(Object o)返回指定元素最后一次出现的索引
public int lastIndexOf(Object o) { int index = size;//初始下标赋值 if (o == null) {//o为null for (Node<E> x = last; x != null; x = x.prev) {//last指针指向的节点开始向前循环 index--; if (x.item == null)//节点的值作内存比较 return index;//返回下标 } } else {//o不为null for (Node<E> x = last; x != null; x = x.prev) {//last指针指向的节点开始向前循环 index--; if (o.equals(x.item))//调用o的equals方法和节点的值比较 return index; } } return -1; }
peek()索但不删除此列表的头部(null返回null)
public E peek() { final Node<E> f = first; return (f == null) ? null : f.item;//如果是null的话不返回对象,返回null }
element()检索但不删除此列表的头部(null会抛出异常)
public E element() { return getFirst(); }
getFirst()返回此列表中的第一个元素(null会抛出异常)
public E getFirst() { final Node<E> f = first; if (f == null) throw new NoSuchElementException(); return f.item; }
poll()检索并删除此列表的头部(null返回null)
public E poll() { final Node<E> f = first; return (f == null) ? null : unlinkFirst(f);//不为null时候,删除并返回第一个节点 }
remove()检索并删除此列表的头部
public E remove() { return removeFirst(); }
offer(E e)将指定的元素添加为此列表的尾部
public boolean offer(E e) { return add(e); }
offerFirst(E e)在指定列表第一个节点前面插入e
public boolean offerFirst(E e) { addFirst(e); return true; }
offerLast(E e)在指定列表最后一个节点后面插入e
public boolean offerLast(E e) { addLast(e); return true; }
peekFirst()检索但不删除此列表的第一个节点(null返回null)
public E peekFirst() { final Node<E> f = first; return (f == null) ? null : f.item; }
peekFirst()检索但不删除此列表的最后一个节点(null返回null)
public E peekLast() { final Node<E> l = last; return (l == null) ? null : l.item; }
pollFirst()检索并删除此列表的第一个节点(null返回null)
public E pollFirst() { final Node<E> f = first; return (f == null) ? null : unlinkFirst(f); }
pollLast()检索并删除此列表的第最后一个节点(null返回null)
public E pollLast() { final Node<E> l = last; return (l == null) ? null : unlinkLast(l); }
push(E e)将元素插入到第一个节点签名
public void push(E e) { addFirst(e); }
pop()移除第一个节点
public E pop() { return removeFirst(); }
removeFirstOccurrence(Object o)删除此中第一次出现的指定元素
public boolean removeFirstOccurrence(Object o) { return remove(o); }
removeLastOccurrence(Object o)删除此中最后一次出现的指定元素
//和lastIndexOf类似,找到后直接调用unlink public boolean removeLastOccurrence(Object o) { if (o == null) { for (Node<E> x = last; x != null; x = x.prev) { if (x.item == null) { unlink(x); return true; } } } else { for (Node<E> x = last; x != null; x = x.prev) { if (o.equals(x.item)) { unlink(x); return true; } } } return false; }