文章目录
  1. 1. LinkedList简介
  2. 2. 运行环境
  3. 3. LinkedList简介
  4. 4. 运行环境
  5. 5. LinkedList的总结

LinkedList简介

LinkedList是基于双向循环链表实现的,除了可以当链表来操作外,还可以当作栈、队列和双向队列来使用

LinkedList同样是非线程安全的,只在单线程下适用;LinkedList实现了Serializable 接口表面可以进行序列化传输,还实现了Cloneable 接口,表示能被克隆

运行环境

  • OS:Win7 64bit
  • idea:IntelliJ IDEA 2017
  • jdkVersion:1.8.0_91 64 bit
  • 使用的pom.xml:无

LinkedList简介

LinkedList是基于双向循环链表实现的,除了可以当链表来操作外,还可以当作栈、队列和双向队列来使用

LinkedList同样是非线程安全的,只在单线程下适用;LinkedList实现了Serializable 接口表面可以进行序列化传输,还实现了Cloneable 接口,表示能被克隆

运行环境

  • OS:Win7 64bit
  • idea:IntelliJ IDEA 2017
  • jdkVersion:1.8.0_91 64 bit
  • 使用的pom.xml:无
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{
//集合的size
transient int size = 0;
/**
* 第一个节点
*/
transient Node<E> first;
/**
* 最后一个节点
*/
transient Node<E> last;
/**
* 构造一个空的LinkedList
*/
public LinkedList() {
}
/**
* 添加指定的元素集合到该集合的最后,添加的顺序就是指定集合遍历的顺序。
* 如果有其他线程的方法修改了入参,对这个方法没有影响
*/
public LinkedList(Collection<? extends E> c) {
this();
addAll(c);
}
/**
* Links e as first element.
*/
private void linkFirst(E e) {
//将原来first设置到f
final Node<E> f = first;
//创建一个新节点,它的前一个节点为空,后一个节点为f
final Node<E> newNode = new Node<>(null, e, f);
//将新创建的节点赋给fist
first = newNode;
//如果原来的first就是null,将最后的节点也覆给新创建的节点
if (f == null)
last = newNode;
else
//否则原来的第一个节点的前一个节点属性设置为创建的心节点
f.prev = newNode;
size++;
modCount++;
}
/**
* 添加元素e到最后
*/
void linkLast(E e) {
final Node<E> l = last;//将最后一个元素赋值给l
//创建一个新Node该Node的前一个节点是l后一个节点是null
final Node<E> newNode = new Node<>(l, e, null);
//将当前节点设置为最后一个节点
last = newNode;
if (l == null)
//如果原最后一个节点为空,则将第一个node设置为当前元素
first = newNode;
else
//否则,将原最后节点的last节点设置为当前节点
l.next = newNode;
size++;
modCount++;
}
/**
* Inserts element e before non-null Node succ.
* 在一个元素前面添加元素
*/
void linkBefore(E e, Node<E> succ) {
// assert succ != null;
final Node<E> pred = succ.prev;//将替换元素的前一个节点拿到
//新建一个节点,该节点的前一个节点是被替换元素的前一个节点,后一个节点
//是被替换的元素
final Node<E> newNode = new Node<>(pred, e, succ);
//修改被替换元素的前一个节点为新加节点
succ.prev = newNode;
if (pred == null)
//如果被替换元素节点的前一个节点为空
//表示新加的节点是第一个节点
first = newNode;
else
//如果不为空则修改,被修改节点的前一个节点的next节点为新创建的节点
//可能有点绕,其实就是要修改被替换节点和被替换节点的前一个节点的next属性
pred.next = newNode;
size++;
modCount++;
}
/**
* Unlinks non-null first node 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//f的下一个节点置为空
first = next;//将移除节点的下一个节点设置为第一个节点
if (next == null)//表示该集合只有一个元素,将集合中的数据置为空
last = null;
else
next.prev = null;
size--;
modCount++;
return element;//返回移除元素
}
/**
* 将最后一个元素的前一个元素设置为last,并设置移除元素的item为空,prev为空
*/
private E unlinkLast(Node<E> l) {
// assert l == last && l != null;
final E element = l.item;
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;
}
/**
* 修改被移除节点的前一个节点的next指向移除节点的next
* 修改被移除节点的后一个节点的prev指向为被移除节点的prev
* 将移除节点的x.item、x.next和x.prev都置为空
*/
E unlink(Node<E> x) {
// assert x != null;
final E element = x.item;
final Node<E> next = x.next;
final Node<E> prev = x.prev;
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);
}
/**
* 添加指定的元素到该集合的最后
* 该方法等同于add方法
*/
public void addLast(E e) {
linkLast(e);
}
/**
* 如果链表中包含指定的元素,则返回true
*/
public boolean contains(Object o) {
return indexOf(o) != -1;
}
/**
* 返回该集合的元素个数
*/
public int size() {
return size;
}
/**
* 添加指定的元素到该集合的最后
* 这个方法和addLast等效
*/
public boolean add(E e) {
linkLast(e);
return true;
}
/**
* 从当前集合中移除第一个配置入参的数据,从第一个元素依次遍历。移除成功返回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) {
//校验index的有效性
checkPositionIndex(index);
Object[] a = c.toArray();
int numNew = a.length;
if (numNew == 0)
return false;
//这两个变量表示替换位置的前一个元素,和替换位置的元素
//因为需要修改这两个元素的next和prev属性
Node<E> pred, succ;
if (index == size) {
//如果添加的位置等于size
succ = null;//替换位置的元素为空
pred = last;//替换位置的前一个元素就是最后一个元素
} else {
succ = node(index);//找到指定index的node
pred = succ.prev;//设置找到node的前一个元素
}
for (Object o : a) {
@SuppressWarnings("unchecked") E e = (E) o;
Node<E> newNode = new Node<>(pred, e, null);
if (pred == null)
//如果前一个节点为空,则新加的节点就是第一个节点
first = newNode;
else
//否则,前一个节点的下一个节点是新加节点
pred.next = newNode;
//将当前节点设置为前一个节点,为下次循环做准备
pred = newNode;
}
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;
x = next;
}
first = last = null;
size = 0;
modCount++;
}
// Positional Access Operations
/**
* 返回指定index的元素
*/
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) {
//校验index的有效性
checkPositionIndex(index);
//如果index等于size表示添加到最后
if (index == size)
linkLast(element);
else
linkBefore(element, node(index));
}
/**
* 移除指定index位置的元素
*/
public E remove(int index) {
checkElementIndex(index);
return unlink(node(index));
}
/**
* 校验参数index是否在集合的正常范围内
*/
private boolean isElementIndex(int index) {
return index >= 0 && index < size;
}
/**
* 校验参数index是否在集合的正常范围内
*/
private boolean isPositionIndex(int index) {
return index >= 0 && index <= size;
}
/**
* Returns the (non-null) Node at the specified element index.
* 返回指定index的Node
*/
Node<E> node(int index) {
// assert isElementIndex(index);
//这里查找使用了2分查找方法,可以将效率提高一倍
if (index < (size >> 1)) {
//如果index的值小于size/2,则从前往后找
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
/**
* 从链表的开始处循环比较指定的元素,如果存在循环到index的值,如果不存在则返回-1
*/
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;
}
// Queue operations.
/**
* 返回第一个元素,不会移除该元素
*/
public E peek() {
final Node<E> f = first;
return (f == null) ? null : f.item;
}
/**
* 返回第一个元素
*/
public E element() {
return getFirst();
}
/**
* 返回第一个元素并移除它,如果集合为空则返回null
* @since 1.5
*/
public E poll() {
final Node<E> f = first;
return (f == null) ? null : unlinkFirst(f);
}
/**
* 移除该集合的第一个元素,并返回
*/
public E remove() {
return removeFirst();
}
/**
* 添加指定的元素到集合的末尾
* @since 1.5
*/
public boolean offer(E e) {
return add(e);
}
// Deque operations
/**
* 在集合的最前面添加一个元素
* @since 1.6
*/
public boolean offerFirst(E e) {
addFirst(e);
return true;
}
/**
* 在集合的最后面添加一个元素
* @since 1.6
*/
public boolean offerLast(E e) {
addLast(e);
return true;
}
/**
* 返回第一个元素,如果该集合是空的则返回null。
* 不会移除该元素
* @since 1.6
*/
public E peekFirst() {
final Node<E> f = first;
return (f == null) ? null : f.item;
}
/**
* 返回最后一个元素,如果该集合是空的则返回null。
* 不会移除该元素
* @since 1.6
*/
public E peekLast() {
final Node<E> l = last;
return (l == null) ? null : l.item;
}
/**
* 返回第一个元素并移除它,如果集合为空则返回null
* @since 1.6
*/
public E pollFirst() {
final Node<E> f = first;
return (f == null) ? null : unlinkFirst(f);
}
/**
* 返回最后一个元素并移除它,如果集合为空则返回null
* @since 1.6
*/
public E pollLast() {
final Node<E> l = last;
return (l == null) ? null : unlinkLast(l);
}
/**
* 和方法addFirst()相同
* @since 1.6
*/
public void push(E e) {
addFirst(e);
}
/**
* 和方法removeFirst()相同
* @since 1.6
*/
public E pop() {
return removeFirst();
}
/**
* 移除第一个匹配入参元素,从头依次遍历。如果没有匹配的则不会改变该元素
*/
public boolean removeFirstOccurrence(Object o) {
return remove(o);
}
/**
* 移除该集合中最后一个配置入参元素,从尾到头依次循环。如果集合中没有则集合不会改变
* 移除成功返回true
*/
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;
}
/**
* 返回一个list的迭代器,该迭代器包含集合中从指定位置开始到结束的所有元素。
* 该list迭代器是快速失败的,已经创建的迭代器在任何时候结构被修改,比如执行了add或remove方法,将会抛出
* ConcurrentModificationException异常
*/
public ListIterator<E> listIterator(int index) {
checkPositionIndex(index);
return new ListItr(index);
}
private class ListItr implements ListIterator<E> {
private Node<E> lastReturned;//返回的元素
private Node<E> next;//下一个元素
private int nextIndex;//下一个index位置
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;
nextIndex++;
return lastReturned.item;
}
public boolean hasPrevious() {
return nextIndex > 0;
}
public E previous() {
checkForComodification();
if (!hasPrevious())
throw new NoSuchElementException();
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);
while (modCount == expectedModCount && nextIndex < size) {
action.accept(next.item);
lastReturned = next;
next = next.next;
nextIndex++;
}
checkForComodification();
}
final void checkForComodification() {
if (modCount != expectedModCount)
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;
}
}
/**
* 将LinkedList转换成Iterator
* @since 1.6
*/
public Iterator<E> descendingIterator() {
return new DescendingIterator();
}
/**
* Adapter to provide descending iterators via ListItr.previous
*/
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();
}
}
@SuppressWarnings("unchecked")
private LinkedList<E> superClone() {
try {
return (LinkedList<E>) super.clone();
} catch (CloneNotSupportedException e) {
throw new InternalError(e);
}
}
/**
* 返回一个浅拷贝对象
*/
public Object clone() {
LinkedList<E> clone = superClone();
// 将复制的对象变成初始化的状态
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);
return clone;
}
/**
* 返回一个数组包含这个集合的所有元素,集合中元素的顺序就是集合中从第一个到最后一个的顺序
* 该数组是新创建的,和该集合没有任何关系
*
*/
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;
return result;
}
/**
* 返回一个数组包含这个集合的所有元素,集合中元素的顺序就是集合中从第一个到最后一个的顺序。返回的数组类型就是参数指定的类型
* 如果指定数组的length小于集合的size将会创建出一个新的数组,创建出来的数组大小和集合size相同。
* 如果指定数组的length大于等于集合size,将替换指定数组的从0开始到集合size的元素,并将size位置的数组元素置为null
* 注意该方法可能会返回一个新的数组,也可能沿用原来的数组
*/
@SuppressWarnings("unchecked")
public <T> T[] toArray(T[] a) {
if (a.length < size)
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)
a[size] = null;
return a;
}
private static final long serialVersionUID = 876323262645176354L;
/**
* Creates a <em><a href="Spliterator.html#binding">late-binding</a></em>
* and <em>fail-fast</em> {@link Spliterator} over the elements in this
* list.
*
* <p>The {@code Spliterator} reports {@link Spliterator#SIZED} and
* {@link Spliterator#ORDERED}. Overriding implementations should document
* the reporting of additional characteristic values.
*
* @implNote
* The {@code Spliterator} additionally reports {@link Spliterator#SUBSIZED}
* and implements {@code trySplit} to permit limited parallelism..
*
* @return a {@code Spliterator} over the elements in this list
* @since 1.8
*/
@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; // batch array size increment
static final int MAX_BATCH = 1 << 25; // max batch array size;
final LinkedList<E> list; // null OK unless traversed
Node<E> current; // current node; null until initialized
int est; // size estimate; -1 until first needed
int expectedModCount; // initialized when est set
int batch; // batch size for splits
LLSpliterator(LinkedList<E> list, int est, int expectedModCount) {
this.list = list;
this.est = est;
this.expectedModCount = expectedModCount;
}
final int getEst() {
int s; // force initialization
final LinkedList<E> lst;
if ((s = est) < 0) {
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();
if (s > 1 && (p = current) != null) {
int n = batch + BATCH_UNIT;
if (n > s)
n = s;
if (n > MAX_BATCH)
n = MAX_BATCH;
Object[] a = new Object[n];
int j = 0;
do { a[j++] = p.item; } while ((p = p.next) != null && j < n);
current = p;
batch = j;
est = s - j;
return Spliterators.spliterator(a, 0, j, Spliterator.ORDERED);
}
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;
}
}
}

LinkedList的总结

  • LinkedList是基于链表的数据结构实现的,添加元素默认到集合的尾部
  • 因为是基于链表实现的,所以没有扩容方法
  • LinkedList查询和删除都分为null和非null两种情况进行处理,LinkedList可以存null元素
  • LinkedList通过index查找元素,使用了二分查找方式,如果index<size/2,则从0开始到index,否则从size-1到index,具体代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    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;
    }
    }
  • LinkedList是基于链表实现方式,所以删除和添加效率高,查询效率低

  • 要注意源码中还实现了栈和队列的操作方法,因此也可以作为栈、队列和双端队列来使用
文章目录
  1. 1. LinkedList简介
  2. 2. 运行环境
  3. 3. LinkedList简介
  4. 4. 运行环境
  5. 5. LinkedList的总结