描述

LinkedList应该也是开发中比较常用的数据结构了,其基于链表数据结构实现,添加和删除效率相对比较高,而随机访问效率偏低

特点

1.LinkedList是双向不循环链表
通过查看链节点类:

    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;}}

可以看到其有数据,上一个节点和下一个节点,所以其是双向的

而通过查看add源码(add->linkLast)

    void linkLast(E e) {final Node<E> l = last;final Node<E> newNode = new Node<>(l, e, null);last = newNode;if (l == null)first = newNode;elsel.next = newNode;size++;modCount++;}

我们可以看到next的节点为null,所以LinkedList是双向不循环链表

2.添加和删除的效率相对比较高
直接添加的函数在上面已经看到了,其直接修改几个节点地址即可做到添加操作
随机添加的函数如下

    public void add(int index, E element) {checkPositionIndex(index);if (index == size)linkLast(element);elselinkBefore(element, node(index));//node()为根据索引查找的函数,稍后再看}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;elsepred.next = newNode;size++;modCount++;}

可以看到,随机添加只是查找到对应索引的节点对象,然后通过修改地址指向来添加到指定位置的
删除的代码:

 removeLast->unlinkLastprivate 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 GClast = prev;if (prev == null)first = null;elseprev.next = null;size--;modCount++;return element;}

随机删除的代码:(也只是修改地址指向而已)

    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;}

3.随机访问效率较低

    public E get(int index) {checkElementIndex(index);return node(index).item;}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;}}

通过代码可以发现,每次通过索引来获取数据都需要遍历,如果当前索引靠前就从first向后遍历,否则从last向前遍历,最坏的情况时间复杂度是n/2,所以如果用在RecyclerView.Adapter中就会出现查找的效率问题(频繁遍历)

4.存储数据占用的内存空间更多

    private static class Node<E> {E item;Node<E> next;Node<E> prev;}

可以看到,每次保存数据都需要将数据包在Node(节点对象)中在保存起来,然后还会有两个对象地址,这样每保存一条数据都会多占用一个Node对象的内存和两个对象地址的内存

5.forEach遍历效率比fori效率更高
使用forEach的话是每次都获取next的节点,而使用fori就是每次都相当于随机获取,显而易见的forEach效率更高

下一篇:数据结构特性解析 (五)hash表

数据结构特性解析 (四)LinkedList相关推荐

  1. 数据结构特性解析 (二) ArrayList

    前言 ArrayList可能是Java中使用次数最多的数据结构了,因此了解其特性比较重要 描述 ArrayList是一个数组队列,相当于动态数组.与Java中的数组相比,它的容量能动态增长. 并且Ar ...

  2. 数据结构特性解析 (一) 数组

    前言 数组是java中最基本的数据结构,有很多更高级的数据接口实现方式都是使用的数组,所以了解数组是很重要的 描述 数组是一个对象,内部有一块连续的内存,自身只占用很小的内存,其他位置都是根据长度和类 ...

  3. 4.2.4 Kafka高级特性解析(物理存储、稳定性:事物,控制器,可靠性,一致性,_consumer_offsets、延时队列、自定义重试队列)

    Kafka高级特性解析 文章目录 Kafka高级特性解析 2.5 物理存储 2.5.1 日志存储概述 2.5.2 日志存储 2.5.2.1 索引 2.5.2.1.1 偏移量 2.5.2.1.2 时间戳 ...

  4. 墨天轮访谈 | SelectDB 衣国垒:Apache Doris(incubating)1.0版本特性解析与未来规划

    分享嘉宾:衣国垒 Apache Doris Committer.SelectDB 联合创始人&CTO 整理:墨天轮社区 导读 大家好,我是来自Apache Doris社区的衣国垒,也是Sele ...

  5. 数据结构图文解析之:哈夫曼树与哈夫曼编码详解及C++模板实现

    0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...

  6. 关于uIP的移植以及部分特性解析和勘误

    关于uIP的移植以及部分特性解析和勘误 关于嵌入式网络的领域,uIP是一个值得去学习的轻量级协议栈,在我的理解里,uIP具有如下特点. 1.封装性好 封装性好体现在uIP它能做到的网络协议栈的底层所做 ...

  7. 关于uIP移植以及部分特性解析和勘误

    关于uIP的移植以及部分特性解析和勘误 原文:http://www.cnblogs.com/CodeHXH/archive/2012/01/19/2327426.html 关于嵌入式网络的领域,uIP ...

  8. RT-Thread 4.1.0 特性解析之LIBC与POSIX

    1. POSIX 渊源 可移植操作系统接口,POSIX 标准定义了操作系统(很多时候针对的是类 Unix 操作系统)应该为应用程序提供的接口标准,从而保证了应用程序在源码层次的可移植性,如今主流的 L ...

  9. GreenDao3.0新特性解析(配置、注解、加密)

    Greendao3.0release与7月6日发布,其中最主要的三大改变就是:1.换包名 2.实体注解 3.加密支持的优化 本文里面会遇到一些代码示例,就摘了官方文档和demo里的例子了,因为他们的例 ...

最新文章

  1. 使用EditPlus打造一个Python IDE
  2. MySQL中的blob和clob
  3. 数据库设计--数据字典
  4. 笛卡尔函数_笛卡尔,伯克利和函数式React式编程
  5. 广州计算机专业王健,王健 - 教师简历 CV- 武汉大学计算机学院
  6. springcache使用笔记003_注释驱动的 Spring cache 基本原理,注意和限制,@CacheEvict 的可靠性问题
  7. anr产生的原理如何避免(android)
  8. 呼吁各行业实现无纸化办公
  9. 十五届恩智浦智能车-四十天做四轮-调车日记
  10. 屏幕录制大师转换方法
  11. 电子数据取证-流程与技术
  12. Fashion MNIST进行分类
  13. Android补间动画原理介绍
  14. 三角函数有理式的不定积分
  15. 学生宿舍管理mysql设计_学生宿舍管理系统的设计与实现(PHP,MySQL)(含录像)
  16. 荣耀play4tpro有没有鸿蒙,荣耀play4tpro有nfc吗?没有 只能借助支付宝等
  17. python和wps-基于python的docx模块处理word和WPS的docx格式文件方式
  18. Ubuntu Fcitx 繁简输入切换
  19. 比较好的android 手机号码,安卓手机最好的系统(五大公认最好用的安卓手机系统)...
  20. 货币的时间价值之复利计算公式

热门文章

  1. 从C语言的角度重构数据结构系列(九)-数据结构哈希表分糖果
  2. 【Linux】9_存储管理交换分区管理Swap
  3. 从0开始构建你的api网关--Spring Cloud Gateway网关实战及原理解析
  4. jenkins搭建流程
  5. Solr之搭建Solr6.0服务并从Mysql上导入数据
  6. 微服务实战(三):深入微服务架构的进程间通信
  7. publishing failed with multiple errors resource is out of sync with the file system--转
  8. zookeeper源码分析之四服务端(单机)处理请求流程
  9. 开发团队如何完成一个项目?
  10. 利用logistic回归构建申请信用评级案例