ToB企服应用市场:ToB评测及商务社交产业平台

标题: 4-LinkedList底层布局和源码分析 [打印本页]

作者: 十念    时间: 2024-7-12 11:23
标题: 4-LinkedList底层布局和源码分析
4-LinkedList底层布局和源码分析

介绍汇总:
1-LinkedList的全面说明

2-LinkedList的底层操作机制

  1. // 节点代码
  2. class Node<E> {
  3.         E item;
  4.         Node<E> next;
  5.         Node<E> prev;
  6.         Node(Node<E> prev, E element, Node<E> next) {
  7.             this.item = element;
  8.             this.next = next;
  9.             this.prev = prev;
  10.         }
  11. }
  12. // 简单双向列表
  13. class LinkedList {
  14.     int size = 0;
  15.     Node<E> first;
  16.     Node<E> last;
  17. }
复制代码
3-LinkedList的运行重要步骤

​                因为双向链表是通过指针指向内存中的数据节点,形成一个链的聚集,所以为啥叫双向链表。所以存储的东西只有指针、巨细,也并没有扩容机制,只要不超出规定的内存,理论上可以无穷添加数据。
  1. // 添加数据为链表第一个,也就是 first 指向的
  2. // 具体流程:
  3. // 1. 根据 first 指针获取当前第一个数据结点
  4. // 2. 创建一个参数为 first 指向为空(第一个结点),数据值,
  5. //                 last 指向当前链表中第一个数据结点的新结点
  6. // 3. 将 first 指向新结点
  7. // 4. 判断加入之前 first 指向是否为空,若为空说明链表为空,则把 last 也指向新结点
  8. //                 反之,说明链表中有数据,而之前 first 指向的数据节点 prev 为 null 所以把之前的
  9. //                 第一个结点的 prev 指向当前的新结点
  10. // 5. 记得一定要将数据个数或长度 + 1 以及链表修改记录
  11. private void linkFirst(E e) {
  12.         final Node<E> f = first;
  13.         final Node<E> newNode = new Node<>(null, e, f);
  14.         first = newNode;
  15.         if (f == null)
  16.             last = newNode;
  17.         else
  18.             f.prev = newNode;
  19.         size++;
  20.         modCount++;
  21. }
  22. // 添加数据为链表最后一个,也就是 last 指向的
  23. // 具体流程:
  24. // 1. 根据 last 指针获取当前最后一个数据结点
  25. // 2. 创建一个参数为 first 指向为当前链表中最后一个数据节点,数据值,
  26. //                 last 指向为空(最后一个结点)的新结点
  27. // 3. 将 last 指向新结点
  28. // 4. 判断加入之前 last 指向是否为空,若为空说明链表为空,则把 first 也指向新结点
  29. //                 反之,说明链表中有数据,而之前 last 指向的数据节点 next 为 null 所以把之前的
  30. //                 最后一个结点的 next 指向当前的新结点
  31. // 5. 记得一定要将数据个数或长度 + 1 以及链表修改记录
  32. void linkLast(E e) {
  33.         final Node<E> l = last;
  34.         final Node<E> newNode = new Node<>(l, e, null);
  35.         last = newNode;
  36.         if (l == null)
  37.             first = newNode;
  38.         else
  39.             l.next = newNode;
  40.         size++;
  41.         modCount++;
  42. }
  43. // 根据索引寻找数据值
  44. // 将链表长度除以 2 ,然后根据该结果与索引的大小比较
  45. // 大的话,说明数据节点离最后一个节点近
  46. // 小的话,说明数据节点离第一个节点近
  47. // 然后开始进行遍历循环匹配索引值的数据节点
  48. Node<E> node(int index) {
  49.         // assert isElementIndex(index);
  50.         if (index < (size >> 1)) {
  51.             Node<E> x = first;
  52.             for (int i = 0; i < index; i++)
  53.                 x = x.next;
  54.             return x;
  55.         } else {
  56.             Node<E> x = last;
  57.             for (int i = size - 1; i > index; i--)
  58.                 x = x.prev;
  59.             return x;
  60.         }
  61. }
复制代码
4-ArrayList 和 LinkedList 比较

聚集底层布局增删的效率改查的效率ArrayList可变数组较低数组扩容较高LinkedList双向链表较高,通过链表追加较低
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4