Java基础——LinkedList源码分析
LinkedList是什么
- LinkedList基于链表的List接口的非同步实现
- LinkedList允许包括null在内的所有元素
- LinkedList是有序的
- LinkedList是fail-fast的
public class LinkedList<E>extends AbstractSequentialList<E>implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{}
- LinkedList实现了 List 接口、底层基于链表实现的,所以它的插入和删除操作比ArrayList更加高效,但链表的随机访问的效率要比ArrayList差
- LinkedList继承自AbstractSequenceList抽象类,提供了List接口骨干性的实现以减少实现 List 接口的复杂度
- LinkedList实现了Deque接口,定义了双端队列的操作,双端队列是一种具有队列和栈的性质的数据结构,双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行
- LinkedList实现了Cloneable接口,即覆盖了函数clone(),能被克隆
- 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
- void addFirst(E e):添加元素到链头
- void addLast(E e):添加元素到链尾
- E removeFirst():移除链头元素
- E removeLast():移除链尾元素
这里个人经验告诉你们。当问到贪吃蛇是怎么实现的,LinkedList绝对是首选
LinkedList与ArrayList的区别
LinkedList | ArrayList |
---|---|
底层是双向链表 | 底层是可变数组 |
不允许随机访问,即查询效率低 | 允许随机访问,即查询效率高 |
插入和删除效率快 | 插入和删除效率低 |
解释一下:
- 对于随机访问的两个方法,get和set,ArrayList优于LinkedList,因为LinkedList要移动指针
- 对于新增和删除两个方法,add和remove,LinedList比较占优势,因为ArrayList要移动数据
总结
对目前学习到的知识进行总结,看图说话
Java基础——LinkedList源码分析相关推荐
- java linkedlist源码_Java集合之LinkedList源码分析
一.LinkedList简介 LinkedList是一种可以在任何位置进行高效地插入和移除操作的有序序列,它是基于双向链表实现的. ps:这里有一个问题,就是关于实现LinkedList的数据结构是否 ...
- Java集合类框架源码分析 之 LinkedList源码解析 【4】
上一篇介绍了ArrayList的源码分析[点击看文章],既然ArrayList都已经做了介绍,那么作为他同胞兄弟的LinkedList,当然必须也配拥有姓名! Talk is cheap,show m ...
- 数组、链表、LinkedList源码分析、跳表
一.数组 1.什么是数组 数组是一种线性表数据结构,它用一组连续的内存空间,来存储一组具有相同类型的数据 线性表:数据排成像一条线一样的结构.每个线性表上的数据最多只有前和后两个方向.其实除了数组,链 ...
- LinkedList 源码分析
前言 上篇文章分析了 ArrayList 的源码,面试过程中经常会被面试官来问 LinkedList 和 ArrayList 的区别,这篇文章从源码的角度来看下 LinkedList 以后,再和上篇文 ...
- JAVA集合专题+源码分析
文章目录 Java集合专题 集合和数组的区别 数组 集合 区别 集合体系结构介绍 单列集合 [Collection ] Collection接口 迭代器 迭代器原理 增强for循环 List接口 对集 ...
- 并发编程5:Java 阻塞队列源码分析(下)
上一篇 并发编程4:Java 阻塞队列源码分析(上) 我们了解了 ArrayBlockingQueue, LinkedBlockingQueue 和 PriorityBlockingQueue,这篇文 ...
- java.util.ServiceLoader源码分析
java.util.ServiceLoader源码分析 回顾: ServiceLoader类的使用(具体参考博客http://blog.csdn.net/liangyihuai/article/det ...
- List接口的常用方法以及ArrayList/LinkedList源码分析
1.List接口的常用方法 ArrayList list = new ArrayList();list.add(123);list.add(456);list.add("AA"); ...
- java自己实现linkedlist_自己根据java的LinkedList源码编写的一个简单的LinkedList实现...
自己实现了一个简单的LinkedList /** * Create by andy on 2018-07-03 11:44 * 根据 {@link java.util.LinkedList}源码 写了 ...
最新文章
- table control中用帮助(F4)实现自动填充另一字段
- Ntop性能提升方案
- I.MX6 Android CAN 命令行测试
- 批量离线下载迅雷快传资源
- 检索数据_18_按照多个字段排序查询结果
- idea 关于高亮显示与选中字符串相同的内容
- mybatis select语句会默认带排序吗_10月阿里最新38道Java面试题解析(MyBatis+消息队列+Redis)...
- 掌握ES6/ES2015核心内容
- C++--第2课 - C++中的引用
- 【随感】我觉得,世界上最美好的乐器是钢琴和架子鼓
- 基于大数据平台的城市规划设计
- SQL注入原理及联合查询
- Ubuntu 16.04+网易云音乐+Adobe Flash+腾讯QQ
- Wireshark lua插件
- 14. echarts画双y轴
- 昭通计算机一级b考试试题及答案,2022云南昭通事业单位考试综合应用能力(B类)考试如何备考?...
- 苹果几是双卡双待_iphone11 pro苹果大革新,支持双卡双待
- 二进制视频数据常见标志位
- maven导入oracle驱动jar包
- 电商云仓储到底是什么?
热门文章
- PIC单片机入门笔记(新手学PIC必看)——基于PIC16F886
- 绘声绘影导出视频过大
- 小程序之修改单条数据
- 【均匀分布和正态分布】
- 氯代吡啶联吡啶废水处理
- 计算机工程师花了三年建模女朋友,网易工作十年游戏建模师,还没有女朋友,是怎样的一种体验?...
- 阿里云弹性计算对视觉计算的思考与实践
- mysql的自身防御不包括_2020高校邦《MySQL数据库基础》作业题库2020智慧树《大学物理 Ⅰ》判断题答案...
- 勾股定理计算机语言,勾股定理
- 【计算机视觉】人类颜色感知、光受体、光波长和颜色信息以及颜色匹配