码迷,mamicode.com
首页 > 其他好文 > 详细

LinkedList源码

时间:2019-06-14 14:18:04      阅读:69      评论:0      收藏:0      [点我收藏+]

标签:magic   list   sea   char   stat   row   indexof   advance   prot   

   

public class TestLinkedList {
    @Test
    public void testQuery() {

         LinkedList1<Integer> list=new LinkedList1<Integer>();
         list.add(22);
         list.add(66);
         list.addFirst(77);
         list.addLast(99);
         Iterator i = list.iterator();//就有了所有的元素了。
         while(i.hasNext()) {
             System.out.println(i.next());
         }
        
         
        A a = new A(1, "1");// linklist.A@4de4b452
        A b = new A(2, "2");// linklist.A@50b5ac82
        LinkedList1<A> list1 = new LinkedList1<A>(Arrays.asList(a, b));// [linklist.A@4de4b452, linklist.A@50b5ac82]
        LinkedList1 list2 = (LinkedList1) list1.clone();// [linklist.A@4de4b452, linklist.A@50b5ac82]。
                                                        // first,last等属性地址不一样了。里面的元素传递的还是地址。
        System.out.println(list1);// [linklist.A@4de4b452, linklist.A@50b5ac82]
        System.out.println(list2);// [linklist.A@4de4b452, linklist.A@50b5ac82]
        a.k = 4;
        a.s = "ff";
        System.out.println(list1);// [linklist.A@4de4b452, linklist.A@50b5ac82],里面的a改变了。
        System.out.println(list2);// [linklist.A@4de4b452, linklist.A@50b5ac82],里面的a改变了。
        Object[] ss = list1.toArray();// [linklist.A@4de4b452, linklist.A@50b5ac82]
        System.out.println(ss);
        a.k = 8;
        a.s = "刚刚";
        System.out.println(ss);// ss里面的a也改变了。
        
        
        Object[] ss1 = list1.toArray(new A[] {new A(3,"3"),new A(33,"33"),new A(444,"444"),new A(555,"555")});
//list的元素 + null + a数组后面的元素, A c = new A(9,"d"); A d = new A(0,"pp"); A f = new A(89,"89"); A g = new A(90,"90"); list1.add(c); list1.add(d); list1.add(f); list1.add(null); list1.add(g); LLSpliterator ll = (LLSpliterator) list1.spliterator(); Spliterator kk = ll.trySplit(); ((Spliterator) ll).forEachRemaining(new Consumer<A>() { public void accept(A a) { System.out.println(a); } }); kk.forEachRemaining(new Consumer<A>() { public void accept(A a) { System.out.println(a); } }); } } class A { public String s; public int k; A(int i, String b) { this.s = b; this.k = i; } }
public class LinkedList1<E> extends AbstractSequentialList1<E> implements List<E>, Deque<E>, Cloneable, 
java.io.Serializable{
transient int size = 0;//结点个数 transient Node<E> first; transient Node<E> last; public LinkedList1() { } public LinkedList1(Collection<? extends E> c) { this(); addAll(c); } private void linkFirst(E e) {//头部加一个元素 final Node<E> f = first;//first有可能是null final Node<E> newNode = new Node<>(null, e, f); first = newNode; if (f == null) last = newNode; else f.prev = newNode; size++; modCount++; } void linkLast(E e) { final Node<E> l = last;//last有可能是null final Node<E> newNode = new Node<>(l, e, null); last = newNode; if (l == null) first = newNode; else l.next = newNode; size++; modCount++; } void linkBefore(E e, Node<E> succ) { assert succ != null; final Node<E> pred = succ.prev;//succ不为null,前驱有可能是null final Node<E> newNode = new Node<>(pred, e, succ); succ.prev = newNode; if (pred == null)//succ是头结点 first = newNode;//新节点是头结点 else pred.next = newNode; size++; modCount++; } //删除头结点 private E unlinkFirst(Node<E> f) { assert f == first && f != null; final E element = f.item;//要return出去的 final Node<E> next = f.next;//要修改前驱结点的 f.item = null; f.next = null; // help GC first = next; if (next == null) last = null; else next.prev = null; size--; modCount++; return element; } //删除尾结点 private E unlinkLast(Node<E> l) { assert l == last && l != null; final E element = l.item;//要return出去的 final Node<E> prev = l.prev;//要修改后继结点的 l.item = null; l.prev = null; // help GC last = prev; if (prev == null) first = null; else prev.next = null; size--; modCount++; return element; } //删除X结点 E unlink(Node<E> x) { assert x != null; final E element = x.item; final Node<E> next = x.next;//next可能是null final Node<E> prev = x.prev;//prev可能是null if (prev == null) { first = next; } else { prev.next = next; x.prev = null; } if (next == null) { last = prev; } else { next.prev = prev; x.next = null; } x.item = null; size--; modCount++; return element; } public E getFirst() { final Node<E> f = first; if (f == null) throw new NoSuchElementException(); return f.item; } public E getLast() { final Node<E> l = last; if (l == null) throw new NoSuchElementException(); return l.item; } public E removeFirst() { final Node<E> f = first; if (f == null) throw new NoSuchElementException(); return unlinkFirst(f); } public E removeLast() { final Node<E> l = last; if (l == null) throw new NoSuchElementException(); return unlinkLast(l); } public void addFirst(E e) { linkFirst(e); } public void addLast(E e) { linkLast(e); } public boolean contains(Object o) { return indexOf(o) != -1; } public int size() { return size; } public boolean add(E e) { linkLast(e); return true; } public boolean remove(Object o) { if (o == null) { for (Node<E> x = first; x != null; x = x.next) { if (x.item == null) { unlink(x); return true; } } } else { for (Node<E> x = first; x != null; x = x.next) { if (o.equals(x.item)) { unlink(x); return true; } } } return false; } //尾部添加,添加时候集合不能修改 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;//pred和succ之间添加 if (index == size) {//尾部添加 succ = null; pred = last; } else { succ = node(index);//中间结点succ后添加 pred = succ.prev; } //先把元素全部加到pred的后面 for (Object o : a) { E e = (E) o; Node<E> newNode = new Node<>(pred, e, null); if (pred == null) first = newNode; else pred.next = newNode; pred = newNode; } //最后加上succ结点 if (succ == null) { last = pred; } else { pred.next = succ; succ.prev = pred; } size += numNew; modCount++; return true; } public void clear() { for (Node<E> x = first; x != null; ) { Node<E> next = x.next; x.item = null; x.next = null; x.prev = null;//每个结点的3个属性全部清空 x = next; } first = last = null; size = 0; modCount++; } public E get(int index) { checkElementIndex(index); return node(index).item; } public E set(int index, E element) { checkElementIndex(index); Node<E> x = node(index); E oldVal = x.item; x.item = element; return oldVal; } public void add(int index, E element) { checkPositionIndex(index); if (index == size) linkLast(element); else linkBefore(element, node(index)); } public E remove(int index) { checkElementIndex(index); return unlink(node(index)); } private boolean isElementIndex(int index) { return index >= 0 && index < size; } 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)); } //双向链表:只能从前找或者从后找。二分。下标为index,第index+1位置的元素。 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; } } // Search Operations public int indexOf(Object o) {//从前向后找,第一个遇到的。 int index = 0; if (o == null) { for (Node<E> x = first; x != null; x = x.next) { if (x.item == null) return index; index++; } } else { for (Node<E> x = first; x != null; x = x.next) { if (o.equals(x.item)) return index; index++; } } return -1; } //从后面开始查找 public int lastIndexOf(Object o) { int index = size; if (o == null) { for (Node<E> x = last; x != null; x = x.prev) { index--; if (x.item == null) return index; } } else { for (Node<E> x = last; x != null; x = x.prev) { index--; if (o.equals(x.item)) return index; } } return -1; } //返回头结点元素,但不清空 public E peek() { final Node<E> f = first; return (f == null) ? null : f.item; } public E element() { return getFirst(); } //返回并清除头结点 public E poll() { final Node<E> f = first; return (f == null) ? null : unlinkFirst(f); } public E remove() { return removeFirst(); } //尾部添加 public boolean offer(E e) { return add(e); } public boolean offerFirst(E e) { addFirst(e); return true; } public boolean offerLast(E e) { addLast(e); return true; } public E peekFirst() { final Node<E> f = first; return (f == null) ? null : f.item; } public E peekLast() { final Node<E> l = last; return (l == null) ? null : l.item; } public E pollFirst() { final Node<E> f = first; return (f == null) ? null : unlinkFirst(f); } public E pollLast() { final Node<E> l = last; return (l == null) ? null : unlinkLast(l); } public void push(E e) { addFirst(e); } public E pop() { return removeFirst(); } public boolean removeFirstOccurrence(Object o) {//从前往后找 return remove(o); } 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; } public ListIterator<E> listIterator(int index) { checkPositionIndex(index); return new ListItr(index);//从index开始遍历,new之后就有了所有的元素了。 } private class ListItr implements ListIterator<E> { private Node<E> next;//还没有访问的元素, private int nextIndex;//还没有访问的索引, private Node<E> lastReturned;//遍历时候的元素 private int expectedModCount = modCount; ListItr(int index) { assert isPositionIndex(index); next = (index == size) ? null : node(index);//下一个访问的元素 nextIndex = index;//下一个访问的索引 } public boolean hasNext() { return nextIndex < size; } public E next() {//遍历一次 checkForComodification(); if (!hasNext()) throw new NoSuchElementException(); lastReturned = next; next = next.next;//修改next nextIndex++;//修改下一个索引 return lastReturned.item;//返回元素 } public boolean hasPrevious() { return nextIndex > 0;//就可以减一 } public E previous() {//前面一个 checkForComodification(); if (!hasPrevious()) throw new NoSuchElementException(); //next == null表示刚刚访问的元素是last元素, lastReturned = next = (next == null) ? last : next.prev; nextIndex--; return lastReturned.item; } public int nextIndex() { return nextIndex; } public int previousIndex() { return nextIndex - 1; } public void remove() { checkForComodification(); if (lastReturned == null) throw new IllegalStateException(); Node<E> lastNext = lastReturned.next; unlink(lastReturned); if (next == lastReturned) next = lastNext; else nextIndex--; lastReturned = null; expectedModCount++; } public void set(E e) { if (lastReturned == null) throw new IllegalStateException(); checkForComodification(); lastReturned.item = e; } public void add(E e) { checkForComodification(); lastReturned = null; if (next == null) linkLast(e); else linkBefore(e, next); nextIndex++; expectedModCount++; } public void forEachRemaining(Consumer<? super E> action) { Objects.requireNonNull(action); //父List被修改了,就快速失败。 while (modCount == expectedModCount && nextIndex < size) { action.accept(next.item); lastReturned = next; next = next.next; nextIndex++; } checkForComodification(); } final void checkForComodification() { if (modCount != expectedModCount)//父List被修改了,就快速失败。 throw new ConcurrentModificationException(); } } 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; } } public Iterator<E> descendingIterator() { return new DescendingIterator(); } //从后往前遍历器 private class DescendingIterator implements Iterator<E> { private final ListItr itr = new ListItr(size()); public boolean hasNext() { return itr.hasPrevious(); } public E next() { return itr.previous(); } public void remove() { itr.remove(); } } private LinkedList1<E> superClone() { try { return (LinkedList1<E>) super.clone();//浅拷贝,地址复制拷贝。 } catch (CloneNotSupportedException e) { throw new InternalError(e); } } //深度拷贝重新建立一个。浅拷贝就是属性地址全是一样的,深拷贝是属性地址不一样。如果元素是对象,对象的地址还是一样。 public Object clone() { LinkedList1<E> clone = superClone();//[linklist.A@4de4b452, linklist.A@50b5ac82] System.out.println(this.first);//@24fcf36f System.out.println(this.last);//@10feca44 System.out.println(clone.first);//@24fcf36f System.out.println(clone.last);//@10feca44 。 浅拷贝属性地址是一样的。 clone.first = clone.last = null; clone.size = 0; clone.modCount = 0; for (Node<E> x = first; x != null; x = x.next) clone.add(x.item);//item也是地址 System.out.println(clone.first);//@3fb1549b System.out.println(clone.last);//@ea6147e 。 深拷贝属性地址不是一样的。里面的元素还是地址传递,所以是一样的 return clone;//[linklist.A@4de4b452, linklist.A@50b5ac82] } public Object[] toArray() { Object[] result = new Object[size]; int i = 0; for (Node<E> x = first; x != null; x = x.next) result[i++] = x.item;//item传递的是地址, return result; } public <T> T[] toArray(T[] a) { if (a.length < size)//a的长度小,把a变成list的长度,并全部置为null。然后把list的元素赋值进去,返回的就是list的数组 a = (T[])java.lang.reflect.Array.newInstance(a.getClass().getComponentType(), size); int i = 0; Object[] result = a; for (Node<E> x = first; x != null; x = x.next) result[i++] = x.item; if (a.length > size)//list的元素 + null + a数组后面的元素, a[size] = null; return a; } private static final long serialVersionUID = 876323262645176354L; public void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException { // Write out any hidden serialization magic s.defaultWriteObject(); // Write out size s.writeInt(size); // Write out all elements in the proper order. for (Node<E> x = first; x != null; x = x.next) s.writeObject(x.item); } @SuppressWarnings("unchecked") public void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException { // Read in any hidden serialization magic s.defaultReadObject(); // Read in size int size = s.readInt(); // Read in all elements in the proper order. for (int i = 0; i < size; i++) linkLast((E)s.readObject()); } @Override public Spliterator<E> spliterator() { return new LLSpliterator<E>(this, -1, 0); } /** A customized variant of Spliterators.IteratorSpliterator */ static final class LLSpliterator<E> implements Spliterator<E> { static final int BATCH_UNIT = 1 << 10; // 批处理数组大小增量, 1024 static final int MAX_BATCH = 1 << 25; // 最大批处理数组大小, 33554432 final LinkedList1<E> list; Node<E> current; // 当前遍历节点 int est; //尾节点,初始值为-1, int expectedModCount; // initialized when est set int batch; // 拆分的批量大小 LLSpliterator(LinkedList1<E> list, int est, int expectedModCount) { this.list = list; this.est = est;//尾节点,初始值为-1, this.expectedModCount = expectedModCount; } final int getEst() { int s; // force initialization final LinkedList1<E> lst; if ((s = est) < 0) {//est为-1 if ((lst = list) == null) s = est = 0; else { expectedModCount = lst.modCount; current = lst.first; s = est = lst.size; } } return s; } public long estimateSize() { return (long) getEst(); } public Spliterator<E> trySplit() { Node<E> p; int s = getEst();//7 if (s > 1 && (p = current) != null) { int n = batch + BATCH_UNIT;//1024+batch if (n > s) n = s; if (n > MAX_BATCH)//33554432,最大大小, n = MAX_BATCH;//n是s,1024+batch,33554432中最小的。 Object[] a = new Object[n]; int j = 0; do { a[j++] = p.item; } while ((p = p.next) != null && j < n);//到达list结尾 或者 把s填满, current = p;//null batch = j;//7 est = s - j;//0 return Spliterators.spliterator(a, 0, j, Spliterator.ORDERED);//返回ArraySpliterator } return null; } public void forEachRemaining(Consumer<? super E> action) { Node<E> p; int n; if (action == null) throw new NullPointerException(); if ((n = getEst()) > 0 && (p = current) != null) { current = null; est = 0; do { E e = p.item; p = p.next; action.accept(e); } while (p != null && --n > 0); } if (list.modCount != expectedModCount) throw new ConcurrentModificationException(); } public boolean tryAdvance(Consumer<? super E> action) { Node<E> p; if (action == null) throw new NullPointerException(); if (getEst() > 0 && (p = current) != null) { --est; E e = p.item; current = p.next; action.accept(e); if (list.modCount != expectedModCount) throw new ConcurrentModificationException(); return true; } return false; } public int characteristics() { return Spliterator.ORDERED | Spliterator.SIZED | Spliterator.SUBSIZED; } } }
public abstract class AbstractSequentialList1<E> extends AbstractList<E> {
    protected AbstractSequentialList1() {
    }

    public E get(int index) {
        try {
            return listIterator(index).next();
        } catch (NoSuchElementException exc) {
            throw new IndexOutOfBoundsException("Index: "+index);
        }
    }

    public E set(int index, E element) {
        try {
            ListIterator<E> e = listIterator(index);
            E oldVal = e.next();
            e.set(element);
            return oldVal;
        } catch (NoSuchElementException exc) {
            throw new IndexOutOfBoundsException("Index: "+index);
        }
    }

    public void add(int index, E element) {
        try {
            listIterator(index).add(element);
        } catch (NoSuchElementException exc) {
            throw new IndexOutOfBoundsException("Index: "+index);
        }
    }

    public E remove(int index) {
        try {
            ListIterator<E> e = listIterator(index);
            E outCast = e.next();
            e.remove();
            return outCast;
        } catch (NoSuchElementException exc) {
            throw new IndexOutOfBoundsException("Index: "+index);
        }
    }


    // Bulk Operations
    public boolean addAll(int index, Collection<? extends E> c) {
        try {
            boolean modified = false;
            ListIterator<E> e1 = listIterator(index);
            Iterator<? extends E> e2 = c.iterator();
            while (e2.hasNext()) {
                e1.add(e2.next());
                modified = true;
            }
            return modified;
        } catch (NoSuchElementException exc) {
            throw new IndexOutOfBoundsException("Index: "+index);
        }
    }


    // Iterators
    public Iterator<E> iterator() {
        return listIterator();
    }
    public abstract ListIterator<E> listIterator(int index);
}

 

LinkedList源码

标签:magic   list   sea   char   stat   row   indexof   advance   prot   

原文地址:https://www.cnblogs.com/yaowen/p/11022877.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!