LinkedList是什么

  1. LinkedList基于链表的List接口的非同步实现
  2. LinkedList允许包括null在内的所有元素
  3. LinkedList是有序的
  4. LinkedList是fail-fast的
public class LinkedList<E>extends AbstractSequentialList<E>implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{}
  1. LinkedList实现了 List 接口、底层基于链表实现的,所以它的插入和删除操作比ArrayList更加高效,但链表的随机访问的效率要比ArrayList差
  2. LinkedList继承自AbstractSequenceList抽象类,提供了List接口骨干性的实现以减少实现 List 接口的复杂度
  3. LinkedList实现了Deque接口,定义了双端队列的操作,双端队列是一种具有队列和栈的性质的数据结构,双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行
  4. LinkedList实现了Cloneable接口,即覆盖了函数clone(),能被克隆
  5. LinkedList实现了java.io.Serializable接口,意味着ArrayList支持序列化

LinkedList的数据结构

LinkedList是基于链表结构实现,在类中包含了first和last两个指针,表示上一个节点和下一个节点的引用,这样就构成了双向的链表

transient int size = 0;
transient Node<E> first; //链表的头指针
transient Node<E> last; //尾指针
//存储对象的结构 Node, 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;}
}

LinkedList的存储

1、add(E e)

该方法是在链表的末尾添加元素,其调用了自己的方法linkLast(E e),linkLast(E e)将last的Node引用指向了一个新的Node(l),然后根据l新建了一个newNode,其中的元素就为要添加的e,而后,我们让 last 指向了 newNode。简单的说就是双向链表的添加操作

public boolean add(E e) {linkLast(e);return true;
}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++;
}

2、add(int index, E element)

该方法是在指定index位置插入元素,如果 index 位置正好等于 size,则调用linkLast(element)将其插入末尾,否则调用linkBefore(element, node(index))方法进行插入。简单的说就是双向链表的添加删除操作

public void add(int index, E element) {checkPositionIndex(index);if (index == size)linkLast(element);elselinkBefore(element, node(index));
}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++;
}

LinkedList的其他API

  1. void addFirst(E e):添加元素到链头
  2. void addLast(E e):添加元素到链尾
  3. E removeFirst():移除链头元素
  4. E removeLast():移除链尾元素

这里个人经验告诉你们。当问到贪吃蛇是怎么实现的,LinkedList绝对是首选

LinkedList与ArrayList的区别

LinkedList ArrayList
底层是双向链表 底层是可变数组
不允许随机访问,即查询效率低 允许随机访问,即查询效率高
插入和删除效率快 插入和删除效率低

解释一下:

  1. 对于随机访问的两个方法,get和set,ArrayList优于LinkedList,因为LinkedList要移动指针
  2. 对于新增和删除两个方法,add和remove,LinedList比较占优势,因为ArrayList要移动数据

总结

对目前学习到的知识进行总结,看图说话

Java基础——LinkedList源码分析相关推荐

  1. java linkedlist源码_Java集合之LinkedList源码分析

    一.LinkedList简介 LinkedList是一种可以在任何位置进行高效地插入和移除操作的有序序列,它是基于双向链表实现的. ps:这里有一个问题,就是关于实现LinkedList的数据结构是否 ...

  2. Java集合类框架源码分析 之 LinkedList源码解析 【4】

    上一篇介绍了ArrayList的源码分析[点击看文章],既然ArrayList都已经做了介绍,那么作为他同胞兄弟的LinkedList,当然必须也配拥有姓名! Talk is cheap,show m ...

  3. 数组、链表、LinkedList源码分析、跳表

    一.数组 1.什么是数组 数组是一种线性表数据结构,它用一组连续的内存空间,来存储一组具有相同类型的数据 线性表:数据排成像一条线一样的结构.每个线性表上的数据最多只有前和后两个方向.其实除了数组,链 ...

  4. LinkedList 源码分析

    前言 上篇文章分析了 ArrayList 的源码,面试过程中经常会被面试官来问 LinkedList 和 ArrayList 的区别,这篇文章从源码的角度来看下 LinkedList 以后,再和上篇文 ...

  5. JAVA集合专题+源码分析

    文章目录 Java集合专题 集合和数组的区别 数组 集合 区别 集合体系结构介绍 单列集合 [Collection ] Collection接口 迭代器 迭代器原理 增强for循环 List接口 对集 ...

  6. 并发编程5:Java 阻塞队列源码分析(下)

    上一篇 并发编程4:Java 阻塞队列源码分析(上) 我们了解了 ArrayBlockingQueue, LinkedBlockingQueue 和 PriorityBlockingQueue,这篇文 ...

  7. java.util.ServiceLoader源码分析

    java.util.ServiceLoader源码分析 回顾: ServiceLoader类的使用(具体参考博客http://blog.csdn.net/liangyihuai/article/det ...

  8. List接口的常用方法以及ArrayList/LinkedList源码分析

    1.List接口的常用方法 ArrayList list = new ArrayList();list.add(123);list.add(456);list.add("AA"); ...

  9. java自己实现linkedlist_自己根据java的LinkedList源码编写的一个简单的LinkedList实现...

    自己实现了一个简单的LinkedList /** * Create by andy on 2018-07-03 11:44 * 根据 {@link java.util.LinkedList}源码 写了 ...

最新文章

  1. table control中用帮助(F4)实现自动填充另一字段
  2. Ntop性能提升方案
  3. I.MX6 Android CAN 命令行测试
  4. 批量离线下载迅雷快传资源
  5. 检索数据_18_按照多个字段排序查询结果
  6. idea 关于高亮显示与选中字符串相同的内容
  7. mybatis select语句会默认带排序吗_10月阿里最新38道Java面试题解析(MyBatis+消息队列+Redis)...
  8. 掌握ES6/ES2015核心内容
  9. C++--第2课 - C++中的引用
  10. 【随感】我觉得,世界上最美好的乐器是钢琴和架子鼓
  11. 基于大数据平台的城市规划设计
  12. SQL注入原理及联合查询
  13. Ubuntu 16.04+网易云音乐+Adobe Flash+腾讯QQ
  14. Wireshark lua插件
  15. 14. echarts画双y轴
  16. 昭通计算机一级b考试试题及答案,2022云南昭通事业单位考试综合应用能力(B类)考试如何备考?...
  17. 苹果几是双卡双待_iphone11 pro苹果大革新,支持双卡双待
  18. 二进制视频数据常见标志位
  19. maven导入oracle驱动jar包
  20. 电商云仓储到底是什么?

热门文章

  1. PIC单片机入门笔记(新手学PIC必看)——基于PIC16F886
  2. 绘声绘影导出视频过大
  3. 小程序之修改单条数据
  4. 【均匀分布和正态分布】
  5. 氯代吡啶联吡啶废水处理
  6. 计算机工程师花了三年建模女朋友,网易工作十年游戏建模师,还没有女朋友,是怎样的一种体验?...
  7. 阿里云弹性计算对视觉计算的思考与实践
  8. mysql的自身防御不包括_2020高校邦《MySQL数据库基础》作业题库2020智慧树《大学物理 Ⅰ》判断题答案...
  9. 勾股定理计算机语言,勾股定理
  10. 【计算机视觉】人类颜色感知、光受体、光波长和颜色信息以及颜色匹配