Java总结 - List实现类ArrayList&LinkedList (6)

这也是构造中调用的方法,我们来看一下实现

public boolean addAll(Collection<? extends E> c) { return addAll(size, c); } public boolean addAll(int index, Collection<? extends E> c) { //检查位置是否越界 checkPositionIndex(index); //集合转数组 Object[] a = c.toArray(); //确定集合元素个数 int numNew = a.length; //如果是空集合返回 if (numNew == 0) return false; //记录前指向和当前节点 Node<E> pred, succ; //如果相等代表在最后追加 if (index == size) { //在最后追加,就不需要当前元素了,因为last已经指向了 succ = null; //添加集合的时候的,集合中首个被添加的元素的前一个节点就是当前链表中的最后一个节点 pred = last; } else { //到这就代表不是在尾部追加,而是将元素追加到链表中间位置 //node方法之前说过就是根据index来返回index位置上的节点 //node返回节点后保存引用 succ = node(index); //记录当前index节点的前节点的引用 pred = succ.prev; //到这就记录好了当前节点和前节点的引用 } //开始循环创建集合中的元素的节点了,然后修改相关指向 for (Object o : a) { //将集合元素强转一下,泛型约束不会classcast E e = (E) o; //创建节点,此节点的前一个元素指向已经确定 Node<E> newNode = new Node<>(pred, e, null); //代表从头开始添加 if (pred == null) //新节点就是first节点 first = newNode; else //新节点前指向是pred,perd.next指向新元素,所以到这形成了前元素和新元素的双向链接 pred.next = newNode; //到这就连接好了旧节点和新节点,需要移动pred指向,指向新节点 //然后将新节点当做旧节点,然后在于新创建的节点做双向链接 pred = newNode; } //到这就把链表从头到集合所有元素都连接完成了,需要处理集合的尾节点和链表的原index节点的链接问题了 //如果原来的尾index节点没有 if (succ == null) { //那么last就指向集合的尾节点 last = pred; } else { //代表之前的链表有index节点,那么就修改index节点和集合的尾节点的链接 pred.next = succ; succ.prev = pred; } //做一些计数操作 size += numNew; modCount++; return true; }

到这其实add方法基本就解析完了,那么顺便前面的构造也就没有问题了,下面是其他方法的源代码

remove

remove()

public E remove() { return removeFirst(); } //可以看到默认从头开始删除 public E removeFirst() { final Node<E> f = first; if (f == null) throw new NoSuchElementException(); return unlinkFirst(f); } private E unlinkFirst(Node<E> f) { // assert f == first && f != null; //取出头元素属性值 final E element = f.item; //取出头元素的下一个元素的引用 final Node<E> next = f.next; //将头元素的属性值置空 f.item = null; f.next = null; // help GC //然后将first指针指向下一个元素 first = next; //如果存在就只有一个元素的情况 if (next == null) //first和last都是null last = null; else //否则就将原来头节点的下一个节点的前引用取消,因为不存在了,自己已经变成了头结点 next.prev = null; size--; modCount++; return element; }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwsjsd.html