Java 集合系列(三)—— LinkedList
程序员文章站
2022-06-28 08:34:53
以脑图的形式来展示Java集合知识,让零碎知识点形成体系 LinkedList LinkedList是一种可以在任何位置进行高效地插入和删除操作的有序序列。 它的最基本存储结构是一个节点:每个节点将存储对象,以及前后节点的引用。 结构图 LinkedList 结构体 LinkedList 结构体 从 ......
以脑图的形式来展示java集合知识,让零碎知识点形成体系
linkedlist
linkedlist是一种可以在任何位置进行高效地插入和删除操作的有序序列。
它的最基本存储结构是一个节点:每个节点将存储对象,以及前后节点的引用。
结构图
从上面的结构图中,我们可以了解到 listedlist 底层是基于双向链表实现的。
围起来的可以看成 linkedlist 类,它定义了三个 transient 成员变量:first、last、size。这三个变量是整个 linkedlist 类的关键点。
- 由于是双向链表(每个node都有保存前后节点的引用),因此我们不管是由 first 还是 last 节点开始迭代,都可以将整个链表的数据找出来;
- 在查询、随机插入以及set等操作都有涉及 size 判断;
- 由于 linkedlist 是双向链表,类中只存储了首尾两个节点,因此查询第n个元素都要从头遍历进行查找。
源码分析
add(e e) 源码分析
1 /** 2 * appends the specified element to the end of this list. 3 * 4 * <p>this method is equivalent to {@link #addlast}. 5 * 6 * @param e element to be appended to this list 7 * @return {@code true} (as specified by {@link collection#add}) 8 */ 9 public boolean add(e e) { 10 linklast(e); 11 return true; 12 } 13 14 /** 15 * links e as last element. 16 */ 17 void linklast(e e) { 18 final node<e> l = last; // 将当前最后一个元素寄存在 l 19 final node<e> newnode = new node<>(l, e, null); // new 一个新节点:pre的引用为l;存储元素为e;next的引用为null 20 last = newnode; // 将新节点引用覆盖成员变量 last 21 if (l == null) 22 first = newnode; // 若l为null,说明之前链表为空,此时新节点为首个元素 23 else 24 l.next = newnode; // 否则,更新l的next引用 25 size++; // size+1 26 modcount++; // 非查询操作 modcount 都会 +1 27 }
add(int index, e element) 方法分析
1 /** 2 * inserts the specified element at the specified position in this list. 3 * shifts the element currently at that position (if any) and any 4 * subsequent elements to the right (adds one to their indices). 5 * 6 * @param index index at which the specified element is to be inserted 7 * @param element element to be inserted 8 * @throws indexoutofboundsexception {@inheritdoc} 9 */ 10 public void add(int index, e element) { 11 checkpositionindex(index); // 检查 index 是否大于 size 12 13 if (index == size) 14 linklast(element); // 直接在链表末尾追加 15 else 16 linkbefore(element, node(index)); // 插入index 节点前面 17 } 18 19 20 // 检查 index 是否超出范围 超出则抛出 indexoutofboundsexception 21 private void checkpositionindex(int index) { 22 if (!ispositionindex(index)) 23 throw new indexoutofboundsexception(outofboundsmsg(index)); 24 } 25 26 /** 27 * tells if the argument is the index of a valid position for an 28 * iterator or an add operation. 29 */ 30 private boolean ispositionindex(int index) { 31 return index >= 0 && index <= size; 32 } 33 34 35 36 /** 37 * 根据 index 查找 node 38 * 该方法利用了双向链表的特性,index 距离哪个链表头近就从哪边开始开始遍历 39 * 时间复杂度为 o(n/2); 40 * 当 index 接近 size 的中间值时,效率最低 41 * returns the (non-null) node at the specified element index. 42 */ 43 node<e> node(int index) { 44 // assert iselementindex(index); 45 46 if (index < (size >> 1)) { // size 右移一位(除以2) 47 node<e> x = first; 48 for (int i = 0; i < index; i++) 49 x = x.next; 50 return x; 51 } else { 52 node<e> x = last; 53 for (int i = size - 1; i > index; i--) 54 x = x.prev; 55 return x; 56 } 57 }
优缺点
优点
- 增删元素效率高(只需要更新节点附近的引用即可)
缺点
- 由于查询需要进行遍历,因此效率低
知识脑图
上一篇: 网站的Google排名策略分析123
下一篇: 英文网站的建设与推广分析
推荐阅读
-
Java8新特性(三)集合之 Stream 流式操作
-
java中集合(LinkedList、HashSet、HashMap、HashTable、Collection、Collections)
-
Java基础系列--08_集合1
-
Java集合系列(二):ArrayList、LinkedList、Vector的使用方法及区别
-
Java之LinkedList源码分析(第三篇:添加元素-List接口)
-
JAVA/JSP学习系列之三
-
Java集合系列(一):集合的定义及分类
-
Java集合系列-HashMap 1.8(二)
-
Java自学-集合框架 ArrayList和LinkedList的区别
-
JAVA 系列——>判断语句if、if...else、if..else if...else、三目运算符替换if