1- <a href =" #1 " target =" _self " >0-1. 简介</a >
21
3- <a href = " #2 " target = " _self " >0-2. 内部结构分析</ a >
2+ <!-- MarkdownTOC -- >
43
5- <a href =" #3 " target =" _self " >0-3. LinkedList源码分析</a >
4+ - [ 简介] ( #简介 )
5+ - [ 内部结构分析] ( #内部结构分析 )
6+ - [ LinkedList源码分析] ( #linkedlist源码分析 )
7+ - [ 构造方法] ( #构造方法 )
8+ - [ 添加(add)方法] ( #添加(add)方法 )
9+ - [ 根据位置取数据的方法] ( #根据位置取数据的方法 )
10+ - [ 根据对象得到索引的方法] ( #根据对象得到索引的方法 )
11+ - [ 检查链表是否包含某对象的方法:] ( #检查链表是否包含某对象的方法: )
12+ - [ 删除(remove/pop)方法] ( #删除(removepop)方法 )
13+ - [ LinkedList类常用方法测试:] ( #linkedlist类常用方法测试: )
614
7- < a href = " #3.1 " target = " _self " >0-3-1. 构造方法</ a >
15+ <!-- /MarkdownTOC -- >
816
9- <a href =" #3.2 " target =" _self " >0-3-2. 添加add方法</a >
10-
11- <a href =" #3.3 " target =" _self " >0-3-3. 根据位置取数据的方法</a >
12-
13- <a href =" #3.4 " target =" _self " >0-3-4. 根据对象得到索引的方法</a >
14-
15- <a href =" #3.5 " target =" _self " >0-3-5. 检查链表是否包含某对象的方法</a >
16-
17- <a href =" #3.6 " target =" _self " >0-3-6. 删除removepop方法</a >
18-
19- <a href =" #4 " target =" _self " >0-4. LinkedList类常用方法</a >
20- ## <font face =" 楷体 " id =" 1 " > 简介</font >
17+ ## <font face =" 楷体 " id =" 1 " >简介</font >
2118<font color =" red " >LinkedList</font >是一个实现了<font color =" red " >List接口</font >和<font color =" red " >Deque接口</font >的<font color =" red " >双端链表</font >。
2219LinkedList底层的链表结构使它<font color =" red " >支持高效的插入和删除操作</font >,另外它实现了Deque接口,使得LinkedList类也具有队列的特性;
2320LinkedList<font color =" red " >不是线程安全的</font >,如果想使LinkedList变成线程安全的,可以调用静态类<font color =" red " >Collections类</font >中的<font color =" red " >synchronizedList</font >方法:
@@ -43,7 +40,7 @@ private static class Node<E> {
4340```
4441这个类就代表双端链表的节点Node。这个类有三个属性,分别是前驱节点,本节点的值,后继结点。
4542
46- ## <font face =" 楷体 " id =" 3 " > LinkedList源码分析</font >
43+ ## <font face =" 楷体 " id =" 3 " >LinkedList源码分析</font >
4744### <font face =" 楷体 " id =" 3.1 " >构造方法</font >
4845** 空构造方法:**
4946``` java
@@ -291,7 +288,7 @@ public int lastIndexOf(Object o) {
291288 return indexOf(o) != - 1 ;
292289 }
293290```
294- ###<font face =" 楷体 " id =" 3.6 " > 删除(remove/pop)方法</font >
291+ ###<font face =" 楷体 " id =" 3.6 " >删除(remove/pop)方法</font >
295292** remove()** ,** removeFirst(),pop():** 删除头节点
296293```
297294public E pop() {
@@ -400,119 +397,119 @@ import java.util.Iterator;
400397import java.util.LinkedList ;
401398
402399public class LinkedListDemo {
403- public static void main (String [] srgs ) {
404- // 创建存放int类型的linkedList
405- LinkedList<Integer > linkedList = new LinkedList<> ();
406- /* ************************* linkedList的基本操作 ************************/
407- linkedList. addFirst(0 ); // 添加元素到列表开头
408- linkedList. add(1 ); // 在列表结尾添加元素
409- linkedList. add(2 , 2 ); // 在指定位置添加元素
410- linkedList. addLast(3 ); // 添加元素到列表结尾
400+ public static void main (String [] srgs ) {
401+ // 创建存放int类型的linkedList
402+ LinkedList<Integer > linkedList = new LinkedList<> ();
403+ /* ************************* linkedList的基本操作 ************************/
404+ linkedList. addFirst(0 ); // 添加元素到列表开头
405+ linkedList. add(1 ); // 在列表结尾添加元素
406+ linkedList. add(2 , 2 ); // 在指定位置添加元素
407+ linkedList. addLast(3 ); // 添加元素到列表结尾
411408
412- System . out. println(" LinkedList(直接输出的): " + linkedList);
413-
414- System . out. println(" getFirst()获得第一个元素: " + linkedList. getFirst()); // 返回此列表的第一个元素
415- System . out. println(" getLast()获得第最后一个元素: " + linkedList. getLast()); // 返回此列表的最后一个元素
416- System . out. println(" removeFirst()删除第一个元素并返回: " + linkedList. removeFirst()); // 移除并返回此列表的第一个元素
417- System . out. println(" removeLast()删除最后一个元素并返回: " + linkedList. removeLast()); // 移除并返回此列表的最后一个元素
418- System . out. println(" After remove:" + linkedList);
419- System . out. println(" contains()方法判断列表是否包含1这个元素:" + linkedList. contains(1 )); // 判断此列表包含指定元素,如果是,则返回true
420- System . out. println(" 该linkedList的大小 : " + linkedList. size()); // 返回此列表的元素个数
421-
422- /* ************************* 位置访问操作 ************************/
423- System . out. println(" -----------------------------------------" );
424- linkedList. set(1 , 3 ); // 将此列表中指定位置的元素替换为指定的元素
425- System . out. println(" After set(1, 3):" + linkedList);
426- System . out. println(" get(1)获得指定位置(这里为1)的元素: " + linkedList. get(1 )); // 返回此列表中指定位置处的元素
427-
428- /* ************************* Search操作 ************************/
429- System . out. println(" -----------------------------------------" );
430- linkedList. add(3 );
431- System . out. println(" indexOf(3): " + linkedList. indexOf(3 )); // 返回此列表中首次出现的指定元素的索引
432- System . out. println(" lastIndexOf(3): " + linkedList. lastIndexOf(3 ));// 返回此列表中最后出现的指定元素的索引
433-
434- /* ************************* Queue操作 ************************/
435- System . out. println(" -----------------------------------------" );
436- System . out. println(" peek(): " + linkedList. peek()); // 获取但不移除此列表的头
437- System . out. println(" element(): " + linkedList. element()); // 获取但不移除此列表的头
438- linkedList. poll(); // 获取并移除此列表的头
439- System . out. println(" After poll():" + linkedList);
440- linkedList. remove();
441- System . out. println(" After remove():" + linkedList); // 获取并移除此列表的头
442- linkedList. offer(4 );
443- System . out. println(" After offer(4):" + linkedList); // 将指定元素添加到此列表的末尾
444-
445- /* ************************* Deque操作 ************************/
446- System . out. println(" -----------------------------------------" );
447- linkedList. offerFirst(2 ); // 在此列表的开头插入指定的元素
448- System . out. println(" After offerFirst(2):" + linkedList);
449- linkedList. offerLast(5 ); // 在此列表末尾插入指定的元素
450- System . out. println(" After offerLast(5):" + linkedList);
451- System . out. println(" peekFirst(): " + linkedList. peekFirst()); // 获取但不移除此列表的第一个元素
452- System . out. println(" peekLast(): " + linkedList. peekLast()); // 获取但不移除此列表的第一个元素
453- linkedList. pollFirst(); // 获取并移除此列表的第一个元素
454- System . out. println(" After pollFirst():" + linkedList);
455- linkedList. pollLast(); // 获取并移除此列表的最后一个元素
456- System . out. println(" After pollLast():" + linkedList);
457- linkedList. push(2 ); // 将元素推入此列表所表示的堆栈(插入到列表的头)
458- System . out. println(" After push(2):" + linkedList);
459- linkedList. pop(); // 从此列表所表示的堆栈处弹出一个元素(获取并移除列表第一个元素)
460- System . out. println(" After pop():" + linkedList);
461- linkedList. add(3 );
462- linkedList. removeFirstOccurrence(3 ); // 从此列表中移除第一次出现的指定元素(从头部到尾部遍历列表)
463- System . out. println(" After removeFirstOccurrence(3):" + linkedList);
464- linkedList. removeLastOccurrence(3 ); // 从此列表中移除最后一次出现的指定元素(从头部到尾部遍历列表)
465- System . out. println(" After removeFirstOccurrence(3):" + linkedList);
466-
467- /* ************************* 遍历操作 ************************/
468- System . out. println(" -----------------------------------------" );
469- linkedList. clear();
470- for (int i = 0 ; i < 100000 ; i++ ) {
471- linkedList. add(i);
472- }
473- // 迭代器遍历
474- long start = System . currentTimeMillis();
475- Iterator<Integer > iterator = linkedList. iterator();
476- while (iterator. hasNext()) {
477- iterator. next();
478- }
479- long end = System . currentTimeMillis();
480- System . out. println(" Iterator:" + (end - start) + " ms" );
481-
482- // 顺序遍历(随机遍历)
483- start = System . currentTimeMillis();
484- for (int i = 0 ; i < linkedList. size(); i++ ) {
485- linkedList. get(i);
486- }
487- end = System . currentTimeMillis();
488- System . out. println(" for:" + (end - start) + " ms" );
489-
490- // 另一种for循环遍历
491- start = System . currentTimeMillis();
492- for (Integer i : linkedList)
493- ;
494- end = System . currentTimeMillis();
495- System . out. println(" for2:" + (end - start) + " ms" );
496-
497- // 通过pollFirst()或pollLast()来遍历LinkedList
498- LinkedList<Integer > temp1 = new LinkedList<> ();
499- temp1. addAll(linkedList);
500- start = System . currentTimeMillis();
501- while (temp1. size() != 0 ) {
502- temp1. pollFirst();
503- }
504- end = System . currentTimeMillis();
505- System . out. println(" pollFirst()或pollLast():" + (end - start) + " ms" );
506-
507- // 通过removeFirst()或removeLast()来遍历LinkedList
508- LinkedList<Integer > temp2 = new LinkedList<> ();
509- temp2. addAll(linkedList);
510- start = System . currentTimeMillis();
511- while (temp2. size() != 0 ) {
512- temp2. removeFirst();
513- }
514- end = System . currentTimeMillis();
515- System . out. println(" removeFirst()或removeLast():" + (end - start) + " ms" );
516- }
409+ System . out. println(" LinkedList(直接输出的): " + linkedList);
410+
411+ System . out. println(" getFirst()获得第一个元素: " + linkedList. getFirst()); // 返回此列表的第一个元素
412+ System . out. println(" getLast()获得第最后一个元素: " + linkedList. getLast()); // 返回此列表的最后一个元素
413+ System . out. println(" removeFirst()删除第一个元素并返回: " + linkedList. removeFirst()); // 移除并返回此列表的第一个元素
414+ System . out. println(" removeLast()删除最后一个元素并返回: " + linkedList. removeLast()); // 移除并返回此列表的最后一个元素
415+ System . out. println(" After remove:" + linkedList);
416+ System . out. println(" contains()方法判断列表是否包含1这个元素:" + linkedList. contains(1 )); // 判断此列表包含指定元素,如果是,则返回true
417+ System . out. println(" 该linkedList的大小 : " + linkedList. size()); // 返回此列表的元素个数
418+
419+ /* ************************* 位置访问操作 ************************/
420+ System . out. println(" -----------------------------------------" );
421+ linkedList. set(1 , 3 ); // 将此列表中指定位置的元素替换为指定的元素
422+ System . out. println(" After set(1, 3):" + linkedList);
423+ System . out. println(" get(1)获得指定位置(这里为1)的元素: " + linkedList. get(1 )); // 返回此列表中指定位置处的元素
424+
425+ /* ************************* Search操作 ************************/
426+ System . out. println(" -----------------------------------------" );
427+ linkedList. add(3 );
428+ System . out. println(" indexOf(3): " + linkedList. indexOf(3 )); // 返回此列表中首次出现的指定元素的索引
429+ System . out. println(" lastIndexOf(3): " + linkedList. lastIndexOf(3 ));// 返回此列表中最后出现的指定元素的索引
430+
431+ /* ************************* Queue操作 ************************/
432+ System . out. println(" -----------------------------------------" );
433+ System . out. println(" peek(): " + linkedList. peek()); // 获取但不移除此列表的头
434+ System . out. println(" element(): " + linkedList. element()); // 获取但不移除此列表的头
435+ linkedList. poll(); // 获取并移除此列表的头
436+ System . out. println(" After poll():" + linkedList);
437+ linkedList. remove();
438+ System . out. println(" After remove():" + linkedList); // 获取并移除此列表的头
439+ linkedList. offer(4 );
440+ System . out. println(" After offer(4):" + linkedList); // 将指定元素添加到此列表的末尾
441+
442+ /* ************************* Deque操作 ************************/
443+ System . out. println(" -----------------------------------------" );
444+ linkedList. offerFirst(2 ); // 在此列表的开头插入指定的元素
445+ System . out. println(" After offerFirst(2):" + linkedList);
446+ linkedList. offerLast(5 ); // 在此列表末尾插入指定的元素
447+ System . out. println(" After offerLast(5):" + linkedList);
448+ System . out. println(" peekFirst(): " + linkedList. peekFirst()); // 获取但不移除此列表的第一个元素
449+ System . out. println(" peekLast(): " + linkedList. peekLast()); // 获取但不移除此列表的第一个元素
450+ linkedList. pollFirst(); // 获取并移除此列表的第一个元素
451+ System . out. println(" After pollFirst():" + linkedList);
452+ linkedList. pollLast(); // 获取并移除此列表的最后一个元素
453+ System . out. println(" After pollLast():" + linkedList);
454+ linkedList. push(2 ); // 将元素推入此列表所表示的堆栈(插入到列表的头)
455+ System . out. println(" After push(2):" + linkedList);
456+ linkedList. pop(); // 从此列表所表示的堆栈处弹出一个元素(获取并移除列表第一个元素)
457+ System . out. println(" After pop():" + linkedList);
458+ linkedList. add(3 );
459+ linkedList. removeFirstOccurrence(3 ); // 从此列表中移除第一次出现的指定元素(从头部到尾部遍历列表)
460+ System . out. println(" After removeFirstOccurrence(3):" + linkedList);
461+ linkedList. removeLastOccurrence(3 ); // 从此列表中移除最后一次出现的指定元素(从头部到尾部遍历列表)
462+ System . out. println(" After removeFirstOccurrence(3):" + linkedList);
463+
464+ /* ************************* 遍历操作 ************************/
465+ System . out. println(" -----------------------------------------" );
466+ linkedList. clear();
467+ for (int i = 0 ; i < 100000 ; i++ ) {
468+ linkedList. add(i);
469+ }
470+ // 迭代器遍历
471+ long start = System . currentTimeMillis();
472+ Iterator<Integer > iterator = linkedList. iterator();
473+ while (iterator. hasNext()) {
474+ iterator. next();
475+ }
476+ long end = System . currentTimeMillis();
477+ System . out. println(" Iterator:" + (end - start) + " ms" );
478+
479+ // 顺序遍历(随机遍历)
480+ start = System . currentTimeMillis();
481+ for (int i = 0 ; i < linkedList. size(); i++ ) {
482+ linkedList. get(i);
483+ }
484+ end = System . currentTimeMillis();
485+ System . out. println(" for:" + (end - start) + " ms" );
486+
487+ // 另一种for循环遍历
488+ start = System . currentTimeMillis();
489+ for (Integer i : linkedList)
490+ ;
491+ end = System . currentTimeMillis();
492+ System . out. println(" for2:" + (end - start) + " ms" );
493+
494+ // 通过pollFirst()或pollLast()来遍历LinkedList
495+ LinkedList<Integer > temp1 = new LinkedList<> ();
496+ temp1. addAll(linkedList);
497+ start = System . currentTimeMillis();
498+ while (temp1. size() != 0 ) {
499+ temp1. pollFirst();
500+ }
501+ end = System . currentTimeMillis();
502+ System . out. println(" pollFirst()或pollLast():" + (end - start) + " ms" );
503+
504+ // 通过removeFirst()或removeLast()来遍历LinkedList
505+ LinkedList<Integer > temp2 = new LinkedList<> ();
506+ temp2. addAll(linkedList);
507+ start = System . currentTimeMillis();
508+ while (temp2. size() != 0 ) {
509+ temp2. removeFirst();
510+ }
511+ end = System . currentTimeMillis();
512+ System . out. println(" removeFirst()或removeLast():" + (end - start) + " ms" );
513+ }
517514}
518515```
0 commit comments