LinkedList的源码分析
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LinkedList的源码分析相关的知识,希望对你有一定的参考价值。
1. LinkedList的定义
1.1 继承于AbstractSequentialList的双向链表,可以被当作堆栈
、队列
或双端队列
进行操作
1.2 有序,非线程安全的双向链表,默认使用尾部插入法
1.3 适用于频繁新增或删除场景,频繁访问场景请选用ArrayList
1.4 插入和删除时间复杂为O(1),其余最差O(n)
1.5 由于实现Deque接口,双端队列相关方法众多
2. LinkedList的继承体系
- 继承
AbstractSequentialList
,能被当作堆栈、队列或双端队列进行操作 - 实现
List
接口,能进行队列操作 - 实现
Deque
接口,能将LinkedList当作双端队列使用 - 实现
Cloneable
接口,重写clone()
,能克隆(浅拷贝) - 实现
java.io.Serializable
接口,支持序列化
3. LinkedList的源码实现
1 public class LinkedList<E> 2 extends AbstractSequentialList<E> 3 implements List<E>, Deque<E>, Cloneable, java.io.Serializable { 4 5 /** 6 * 记录当前链表中元素的个数 7 */ 8 transient int size = 0; 9 10 /** 11 * Pointer to first node. 12 * Invariant: (first == null && last == null) || 13 * (first.prev == null && first.item != null) 14 * 链表的头部节点 15 */ 16 transient Node<E> first; 17 18 /** 19 * Pointer to last node. 20 * Invariant: (first == null && last == null) || 21 * (last.next == null && last.item != null) 22 * 链表的尾部节点 23 */ 24 transient Node<E> last; 25 26 /** 27 * Constructs an empty list. 28 * 默认空构造器 -- 注意LinkedList并不提供指定容量的构造器 29 */ 30 public LinkedList() { 31 } 32 33 /** 34 * 支持将一个Collection对象转换为linkedList对象 35 */ 36 public LinkedList(Collection<? extends E> c) { 37 this(); 38 addAll(c); 39 } 40 41 /** 42 * 从头部开始添加一个元素 43 */ 44 private void linkFirst(E e) { 45 //获取头部节点 46 final Node<E> f = first; 47 48 //组建新的节点,新的节点的prev为null,并赋值给头部节点 49 final Node<E> newNode = new Node<>(null, e, f); 50 first = newNode; 51 52 //头节点==null.说明链表中没有元素 53 if (f == null) 54 last = newNode; 55 else 56 f.prev = newNode; //设置旧的头节点的前一个节点为新建的节点 57 size++; 58 modCount++; 59 } 60 61 /** 62 * Links e as last element. 63 * 从尾部开始添加一个元素 64 */ 65 void linkLast(E e) { 66 67 //获取尾部节点 68 final Node<E> l = last; 69 70 //组建新的节点,新节点的next节点为null,并将新的节点赋值给尾部节点 71 final Node<E> newNode = new Node<>(l, e, null); 72 last = newNode; 73 74 //尾部节点为null,说明链表中没有元素 75 if (l == null) 76 first = newNode; 77 else 78 l.next = newNode; //设置旧的尾节点的next为新建的节点 79 size++; 80 modCount++; 81 } 82 83 /** 84 * 在指定的节点之前添加元素 85 */ 86 void linkBefore(E e, Node<E> succ) { 87 88 //获取指定节点的prev 89 final Node<E> pred = succ.prev; 90 91 //构建新的节点 92 final Node<E> newNode = new Node<>(pred, e, succ); 93 //将新建的节点设置为指定节点的prev 94 succ.prev = newNode; 95 96 //判断prev是否为头结点 97 if (pred == null) 98 first = newNode; 99 else 100 pred.next = newNode; //设置新节点为prev的next节点 101 size++; 102 modCount++; 103 } 104 105 /** 106 * 移除头部节点 107 */ 108 private E unlinkFirst(Node<E> f) { 109 // assert f == first && f != null; 110 final E element = f.item; 111 112 //获取头节点的next,并赋值给first 113 final Node<E> next = f.next; 114 f.item = null; 115 f.next = null; // help GC 116 first = next; 117 118 //next == null,说明链表中已经没有元素 119 if (next == null) 120 last = null; 121 else 122 next.prev = null; //设置头结点的prev为null 123 size--; 124 modCount++; 125 return element; 126 } 127 128 /** 129 * 移除尾部节点 130 */ 131 private E unlinkLast(Node<E> l) { 132 // assert l == last && l != null; 133 final E element = l.item; 134 135 //获取尾部节点的prev节点,并赋值为last节点 136 final Node<E> prev = l.prev; 137 l.item = null; 138 l.prev = null; // help GC 139 last = prev; 140 141 //prev == null,说明链表中已经没有元素 142 if (prev == null) 143 first = null; 144 else 145 prev.next = null; //设置尾节点的next为空 146 size--; 147 modCount++; 148 return element; 149 } 150 151 /** 152 * 移除链表中的某个节点 153 */ 154 E unlink(Node<E> x) { 155 156 //获取要移除的元素 157 final E element = x.item; 158 final Node<E> next = x.next; 159 final Node<E> prev = x.prev; 160 161 //要移除的节点是否是头结点 162 if (prev == null) { 163 first = next; 164 } else { 165 //把当前节点的prev节点的next节点赋值为当前节点的next 166 prev.next = next; 167 //当前节点的prev置为null 168 x.prev = null; 169 } 170 171 //要移除的节点是否是尾节点 172 if (next == null) { 173 last = prev; 174 } else { 175 //当前节点的next节点的prev节点赋值为当前节点的prev 176 next.prev = prev; 177 x.next = null; 178 } 179 180 //将当前节点置为null 181 x.item = null; 182 size--; 183 modCount++; 184 return element; 185 } 186 187 /** 188 * 获取链表中的第一个元素 189 */ 190 public E getFirst() { 191 final Node<E> f = first; 192 if (f == null) 193 throw new NoSuchElementException(); 194 return f.item; 195 } 196 197 /** 198 * 获取链表中的最后一个元素 199 */ 200 public E getLast() { 201 final Node<E> l = last; 202 if (l == null) 203 throw new NoSuchElementException(); 204 return l.item; 205 } 206 207 /** 208 * 移除链表中的第一个元素并返回 209 */ 210 public E removeFirst() { 211 final Node<E> f = first; 212 if (f == null) 213 throw new NoSuchElementException(); 214 215 //执行移除头部节点的方法 216 return unlinkFirst(f); 217 } 218 219 /** 220 * 移除链表中的最后一个元素并返回 221 */ 222 public E removeLast() { 223 final Node<E> l = last; 224 if (l == null) 225 throw new NoSuchElementException(); 226 227 //执行移除尾部节点的方法 228 return unlinkLast(l); 229 } 230 231 /** 232 * 在链表的头部添加节点 233 */ 234 public void addFirst(E e) { 235 linkFirst(e); 236 } 237 238 /** 239 * 在链表的尾部添加节点 240 */ 241 public void addLast(E e) { 242 linkLast(e); 243 } 244 245 /** 246 * 链表中是否包含某个元素 247 */ 248 public boolean contains(Object o) { 249 return indexOf(o) != -1; 250 } 251 252 /** 253 * 链表中元素的个数 254 */ 255 public int size() { 256 return size; 257 } 258 259 /** 260 * 添加一个元素到链表中 261 * 默认是尾部添加 262 * 成功则返回true 263 */ 264 public boolean add(E e) { 265 linkLast(e); 266 return true; 267 } 268 269 /** 270 * 移除链表中的某个元素 271 */ 272 public boolean remove(Object o) { 273 if (o == null) { 274 //遍历查找null元素,并进行移除 275 for (Node<E> x = first; x != null; x = x.next) { 276 if (x.item == null) { 277 //执行移除的方法 278 unlink(x); 279 return true; 280 } 281 } 282 } else { 283 //遍历找到要移除的元素 284 for (Node<E> x = first; x != null; x = x.next) { 285 if (o.equals(x.item)) { 286 //执行移除的方法 287 unlink(x); 288 return true; 289 } 290 } 291 } 292 return false; 293 } 294 295 /** 296 * 将一个collection对象转换为链表中的节点 297 */ 298 public boolean addAll(Collection<? extends E> c) { 299 return addAll(size, c); 300 } 301 302 /** 303 * 304 */ 305 public boolean addAll(int index, Collection<? extends E> c) { 306 307 //检查索引的合理性 308 checkPositionIndex(index); 309 310 //将collection对象转换为数组,数组为空则直接返回 311 Object[] a = c.toArray(); 312 int numNew = a.length; 313 if (numNew == 0) 314 return false; 315 316 //判断是在指定位置插入节点还是在尾部插入节点 317 Node<E> pred, succ; 318 if (index == size) { 319 succ = null; 320 pred = last; 321 } else { 322 succ = node(index); 323 pred = succ.prev; 324 } 325 326 //遍历数组,进行插入 327 for (Object o : a) { 328 @SuppressWarnings("unchecked") E e = (E) o; 329 Node<E> newNode = new Node<>(pred, e, null); 330 //判断链表书否为空 331 if (pred == null) 332 first = newNode; 333 else 334 pred.next = newNode; 335 pred = newNode; 336 } 337 338 //如果succ为null,则是在尾部进行节点的插入 339 if (succ == null) { 340 last = pred; 341 } else { 342 //将新插入的节点和后面的节点进行链接 343 pred.next = succ; 344 succ.prev = pred; 345 } 346 347 size += numNew; 348 modCount++; 349 return true; 350 } 351 352 /** 353 * 清空链表中的元素 354 */ 355 public void clear() { 356 357 //循环设置链表的值为null,加快gc 358 for (Node<E> x = first; x != null; ) { 359 Node<E> next = x.next; 360 x.item = null; 361 x.next = null; 362 x.prev = null; 363 x = next; 364 } 365 first = last = null; 366 size = 0; 367 modCount++; 368 } 369 370 /** 371 * 获取指定位置的元素 372 */ 373 public E get(int index) { 374 //检查索引的合理性 375 checkElementIndex(index); 376 return node(index).item; 377 } 378 379 /** 380 * 替换指定位置上的元素并返回旧的元素 381 */ 382 public E set(int index, E element) { 383 checkElementIndex(index); 384 //找到指定元素所在的节点 385 Node<E> x = node(index); 386 E oldVal = x.item; 387 x.item = element; 388 return oldVal; 389 } 390 391 /** 392 * 在指定的位置添加元素 393 */ 394 public void add(int index, E element) { 395 checkPositionIndex(index); 396 397 if (index == size) 398 linkLast(element); 399 else 400 linkBefore(element, node(index)); 401 } 402 403 /** 404 * 移除指定位置的元素 405 */ 406 public E remove(int index) { 407 //检查索引的合理性 408 checkElementIndex(index); 409 //进行指定位置上的节点移除 410 return unlink(node(index)); 411 } 412 413 414 private boolean isElementIndex(int index) { 415 return index >= 0 && index < size; 416 } 417 418 private boolean isPositionIndex(int index) { 419 return index >= 0 && index <= size; 420 } 421 422 private String outOfBoundsMsg(int index) { 423 return "Index: "+index+", Size: "+size; 424 } 425 426 /** 427 * 检查索引是否合理 428 * @param index 429 */ 430 private void checkElementIndex(int index) { 431 if (!isElementIndex(index)) 432 throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); 433 } 434 435 436 private void checkPositionIndex(int index) { 437 if (!isPositionIndex(index)) 438 throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); 439 } 440 441 /** 442 * 返回某个位置上的节点元素 443 */ 444 Node<E> node(int index) { 445 446 //二分查找 447 if (index < (size >> 1)) { 448 Node<E> x = first; 449 for (int i = 0; i < index; i++) 450 x = x.next; 451 return x; 452 } else { 453 Node<E> x = last; 454 for (int i = size - 1; i > index; i--) 455 x = x.prev; 456 return x; 457 } 458 } 459 460 /** 461 * 元素存在于链表中,则返回所在的节点的位置 462 * 否则返回-1 463 */ 464 public int indexOf(Object o) { 465 //初始化为0 466 int index = 0; 467 //如果元素为null,返回第一个查找到的null的位置 468 if (o == null) { 469 //遍历链表,查找null元素,并增加index的值 470 for (Node<E> x = first; x != null; x = x.next) { 471 if (x.item == null) 472 return index; 473 index++; 474 } 475 } else { 476 //遍历链表,查找元素,并增加index的值 477 for (Node<E> x = first; x != null; x = x.next) { 478 if (o.equals(x.item)) 479 return index; 480 index++; 481 } 482 } 483 return -1; 484 } 485 486 /** 487 * 从链表的尾节点开始查找指定的元素 488 * 并返回指定元素的位置 489 * 没有找到返回-1 490 */ 491 public int lastIndexOf(Object o) { 492 int index = size; 493 //指定的元素是否为null 494 if (o == null) { 495 //遍历查找null元素 496 for (Node<E> x = last; x != null; x = x.prev) { 497 index--; 498 if (x.item == null) 499 return index; 500 } 501 } else { 502 //遍历查找指定的元素 503 for (Node<E> x = last; x != null; x = x.prev) { 504 index--; 505 if (o.equals(x.item)) 506 return index; 507 } 508 } 509 return -1; 510 } 511 512 /** 513 * 进行出队列的操作 514 */ 515 public E peek() { 516 final Node<E> f = first; 517 return (f == null) ? null : f.item; 518 } 519 520 /** 521 * 获取链表中的一个元素 522 * 默认返回头结点的元素 523 */ 524 public E element() { 525 return getFirst(); 526 } 527 528 /** 529 * 进行出队列的操作 530 * 并移除元素 531 */ 532 public E poll() { 533 final Node<E> f = first; 534 return (f == null) ? null : unlinkFirst(f); 535 } 536 537 /** 538 * 移除链表中的元素 539 * 默认为头结点的元素 540 */ 541 public E remove() { 542 return removeFirst(); 543 } 544 545 /** 546 * 添加元素,默认在尾部添加 547 */ 548 public boolean offer(E e) { 549 return add(e); 550 } 551 552 553 /** 554 * 在链表的头部添加元素 555 * 成功则返回true 556 */ 557 public boolean offerFirst(E e) { 558 addFirst(e); 559 return true; 560 } 561 562 /** 563 * 在尾部添加元素 564 */ 565 public boolean offerLast(E e) { 566 addLast(e); 567 return true; 568 } 569 570 /** 571 * 获取第一个元素 572 */ 573 public E peekFirst() { 574 final Node<E> f = first; 575 return (f == null) ? null : f.item; 576 } 577 578 /** 579 * 获取最后一个元素 580 */ 581 public E peekLast() { 582 final Node<E> l = last; 583 return (l == null) ? null : l.item; 584 } 585 586 /** 587 * 获取第一个元素 588 * 并移除 589 */ 590 public E pollFirst() { 591 final Node<E> f = first; 592 return (f == null) ? null : unlinkFirst(f); 593 } 594 595 /** 596 * 获取最后一个元素 597 * 并移除 598 */ 599 public E pollLast() { 600 final Node<E> l = last; 601 return (l == null) ? null : unlinkLast(l); 602 } 603 604 /** 605 * 头部添加元素 606 */ 607 public void push(E e) { 608 addFirst(e); 609 } 610 611 /** 612 * 移除头部元素 613 */ 614 public E pop() { 615 return removeFirst(); 616 } 617 618 /** 619 * 从头查找,并移除指定的元素 620 * 成功返回true 621 */ 622 public boolean removeFirstOccurrence(Object o) { 623 return remove(o); 624 } 625 626 /** 627 * 从尾部查找,并移除指定的元素 628 * 成功返回true 629 */ 630 public boolean removeLastOccurrence(Object o) { 631 if (o == null) { 632 //遍历查找指定的null元素 633 for (Node<E> x = last; x != null; x = x.prev) { 634 if (x.item == null) { 635 unlink(x); 636 return true; 637 } 638 } 639 } else { 640 //遍历查找指定的元素 641 for (Node<E> x = last; x != null; x = x.prev) { 642 if (o.equals(x.item)) { 643 unlink(x); 644 return true; 645 } 646 } 647 } 648 return false; 649 } 650 651 /** 652 * 从指定位置开始获取链表的迭代器 653 */ 654 public ListIterator<E> listIterator(int index) { 655 checkPositionIndex(index); 656 return new ListItr(index); 657 } 658 659 /** 660 * 链表的内部类 661 * 一个迭代器对象 662 * @author Administrator 663 * 664 */ 665 private class ListItr implements ListIterator<E> { 666 private Node<E> lastReturned; 667 private Node<E> next; 668 private int nextIndex; 669 private int expectedModCount = modCount; 670 671 ListItr(int index) { 672 // assert isPositionIndex(index); 673 next = (index == size) ? null : node(index); 674 nextIndex = index; 675 } 676 677 public boolean hasNext() { 678 return nextIndex < size; 679 } 680 681 public E next() { 682 checkForComodification(); 683 if (!hasNext()) 684 throw new NoSuchElementException(); 685 686 lastReturned = next; 687 next = next.next; 688 nextIndex++; 689 return lastReturned.item; 690 } 691 692 public boolean hasPrevious() { 693 return nextIndex > 0; 694 } 695 696 public E previous() { 697 checkForComodification(); 698 if (!hasPrevious()) 699 throw new NoSuchElementException(); 700 701 lastReturned = next = (next == null) ? last : next.prev; 702 nextIndex--; 703 return lastReturned.item; 704 } 705 706 public int nextIndex() { 707 return nextIndex; 708 } 709 710 public int previousIndex() { 711 return nextIndex - 1; 712 } 713 714 public void remove() { 715 checkForComodification(); 716 if (lastReturned == null) 717 throw new IllegalStateException(); 718 719 Node<E> lastNext = lastReturned.next; 720 unlink(lastReturned); 721 if (next == lastReturned) 722 next = lastNext; 723 else 724 nextIndex--; 725 lastReturned = null; 726 expectedModCount++; 727 } 728 729 public void set(E e) { 730 if (lastReturned == null) 731 throw new IllegalStateException(); 732 checkForComodification(); 733 lastReturned.item = e; 734 } 735 736 public void add(E e) { 737 checkForComodification(); 738 lastReturned = null; 739 if (next == null) 740 linkLast(e); 741 else 742 linkBefore(e, next); 743 nextIndex++; 744 expectedModCount++; 745 } 746 747 public void forEachRemaining(Consumer<? super E> action) { 748 Objects.requireNonNull(action); 749 while (modCount == expectedModCount && nextIndex < size) { 750 action.accept(next.item); 751 lastReturned = next; 752 next = next.next; 753 nextIndex++; 754 } 755 checkForComodification(); 756 } 757 758 final void checkForComodification() { 759 if (modCount != expectedModCount) 760 throw new ConcurrentModificationException(); 761 } 762 } 763 764 /** 765 * 链表中保存的节点对象 766 * @param <E> 767 */ 768 private static class Node<E> { 769 E item; //当前元素 770 Node<E> next; //下一个元素 771 Node<E> prev; //上一个元素 772 773 Node(Node<E> prev, E element, Node<E> next) { 774 this.item = element; 775 this.next = next; 776 this.prev = prev; 777 } 778 } 779 780 /** 781 * @since 1.6 782 */ 783 public Iterator<E> descendingIterator() { 784 return new DescendingIterator(); 785 } 786 787 /** 788 * Adapter to provide descending iterators via ListItr.previous 789 */ 790 private class DescendingIterator implements Iterator<E> { 791 private final ListItr itr = new ListItr(size()); 792 public boolean hasNext() { 793 return itr.hasPrevious(); 794 } 795 public E next() { 796 return itr.previous(); 797 } 798 public void remove() { 799 itr.remove(); 800 } 801 } 802 803 /** 804 * 调用父类进行链表的克隆 805 * @return 806 */ 807 @SuppressWarnings("unchecked") 808 private LinkedList<E> superClone() { 809 try { 810 return (LinkedList<E>) super.clone(); 811 } catch (CloneNotSupportedException e) { 812 throw new InternalError(e); 813 } 814 } 815 816 /** 817 * 进行链表的克隆 818 */ 819 public Object clone() { 820 LinkedList<E> clone = superClone(); 821 822 // Put clone into "virgin" state 823 clone.first = clone.last = null; 824 clone.size = 0; 825 clone.modCount = 0; 826 827 // Initialize clone with our elements 828 for (Node<E> x = first; x != null; x = x.next) 829 clone.add(x.item); 830 831 return clone; 832 } 833 834 /** 835 * 将链表转换为Object类型的数组 836 */ 837 public Object[] toArray() { 838 Object[] result = new Object[size]; 839 int i = 0; 840 for (Node<E> x = first; x != null; x = x.next) 841 result[i++] = x.item; 842 return result; 843 } 844 845 /** 846 * 将链表转换为指定类型的数组 847 */ 848 @SuppressWarnings("unchecked") 849 public <T> T[] toArray(T[] a) { 850 if (a.length < size) 851 a = (T[])java.lang.reflect.Array.newInstance( 852 a.getClass().getComponentType(), size); 853 int i = 0; 854 Object[] result = a; 855 for (Node<E> x = first; x != null; x = x.next) 856 result[i++] = x.item; 857 858 if (a.length > size) 859 a[size] = null; 860 861 return a; 862 } 863 864 private static final long serialVersionUID = 876323262645176354L; 865 866 /** 867 * 序列化链表中的元素 868 */ 869 private void writeObject(java.io.ObjectOutputStream s) 870 throws java.io.IOException { 871 // Write out any hidden serialization magic 872 s.defaultWriteObject(); 873 874 // Write out size 875 s.writeInt(size); 876 877 // Write out all elements in the proper order. 878 for (Node<E> x = first; x != null; x = x.next) 879 s.writeObject(x.item); 880 } 881 882 /** 883 * 反序列化链表中的元素 884 */ 885 @SuppressWarnings("unchecked") 886 private void readObject(java.io.ObjectInputStream s) 887 throws java.io.IOException, ClassNotFoundException { 888 // Read in any hidden serialization magic 889 s.defaultReadObject(); 890 891 // Read in size 892 int size = s.readInt(); 893 894 // Read in all elements in the proper order. 895 for (int i = 0; i < size; i++) 896 linkLast((E)s.readObject()); 897 } 898 899 /** 900 * java8新增的返回 901 * 返回一个并行的分片迭代器 902 */ 903 @Override 904 public Spliterator<E> spliterator() { 905 return new LLSpliterator<E>(this, -1, 0); 906 } 907 908 /** A customized variant of Spliterators.IteratorSpliterator */ 909 static final class LLSpliterator<E> implements Spliterator<E> { 910 static final int BATCH_UNIT = 1 << 10; // batch array size increment 911 static final int MAX_BATCH = 1 << 25; // max batch array size; 912 final LinkedList<E> list; // null OK unless traversed 913 Node<E> current; // current node; null until initialized 914 int est; // size estimate; -1 until first needed 915 int expectedModCount; // initialized when est set 916 int batch; // batch size for splits 917 918 LLSpliterator(LinkedList<E> list, int est, int expectedModCount) { 919 this.list = list; 920 this.est = est; 921 this.expectedModCount = expectedModCount; 922 } 923 924 final int getEst() { 925 int s; // force initialization 926 final LinkedList<E> lst; 927 if ((s = est) < 0) { 928 if ((lst = list) == null) 929 s = est = 0; 930 else { 931 expectedModCount = lst.modCount; 932 current = lst.first; 933 s = est = lst.size; 934 } 935 } 936 return s; 937 } 938 939 public long estimateSize() { return (long) getEst(); } 940 941 public Spliterator<E> trySplit() { 942 Node<E> p; 943 int s = getEst(); 944 if (s > 1 && (p = current) != null) { 945 int n = batch + BATCH_UNIT; 946 if (n > s) 947 n = s; 948 if (n > MAX_BATCH) 949 n = MAX_BATCH; 950 Object[] a = new Object[n]; 951 int j = 0; 952 do { a[j++] = p.item; } while ((p = p.next) != null && j < n); 953 current = p; 954 batch = j; 955 est = s - j; 956 return Spliterators.spliterator(a, 0, j, Spliterator.ORDERED); 957 } 958 return null; 959 } 960 961 public void forEachRemaining(Consumer<? super E> action) { 962 Node<E> p; int n; 963 if (action == null) throw new NullPointerException(); 964 if ((n = getEst()) > 0 && (p = current) != null) { 965 current = null; 966 est = 0; 967 do { 968 E e = p.item; 969 p = p.next; 970 action.accept(e); 971 } while (p != null && --n > 0); 972 } 973 if (list.modCount != expectedModCount) 974 throw new ConcurrentModificationException(); 975 } 976 977 public boolean tryAdvance(Consumer<? super E> action) { 978 Node<E> p; 979 if (action == null) throw new NullPointerException(); 980 if (getEst() > 0 && (p = current) != null) { 981 --est; 982 E e = p.item; 983 current = p.next; 984 action.accept(e); 985 if (list.modCount != expectedModCount) 986 throw new ConcurrentModificationException(); 987 return true; 988 } 989 return false; 990 } 991 992 public int characteristics() { 993 return Spliterator.ORDERED | Spliterator.SIZED | Spliterator.SUBSIZED; 994 } 995 } 996 997 }
以上是关于LinkedList的源码分析的主要内容,如果未能解决你的问题,请参考以下文章