LinkedList源码
Posted yaowen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LinkedList源码相关的知识,希望对你有一定的参考价值。
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");// [email protected] A b = new A(2, "2");// [email protected] LinkedList1<A> list1 = new LinkedList1<A>(Arrays.asList(a, b));// [[email protected], [email protected]] LinkedList1 list2 = (LinkedList1) list1.clone();// [[email protected], [email protected]]。 // first,last等属性地址不一样了。里面的元素传递的还是地址。 System.out.println(list1);// [[email protected], [email protected]] System.out.println(list2);// [[email protected], [email protected]] a.k = 4; a.s = "ff"; System.out.println(list1);// [[email protected], [email protected]],里面的a改变了。 System.out.println(list2);// [[email protected], [email protected]],里面的a改变了。 Object[] ss = list1.toArray();// [[email protected], [email protected]] 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();//[[email protected], [email protected]] 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;//[[email protected], [email protected]] 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源码的主要内容,如果未能解决你的问题,请参考以下文章