上一篇写的是ArrayList,这一篇写一下LinkedList.

开宗明义,因为Vector已经被废弃了,所以list家族只剩下ArrayList和LinkedList两兄弟了,这里直接对比一下二位:

ArrayList基于动态数组的实现,它长于随机访问元素,但是在中间插入和移除元素时较慢

LinkedList基于链表实现,在List中间进行插入和删除的代价较低,提供了优化的顺序访问。LinkedList在随机访问方面相对比较慢,但是它的特性集较ArrayList更大。

那么,到底特性集大在哪里呢?

这就是这篇博客的重点,在JAVA中,LinkedList可以作为我们最经常使用的两种数据结构来使用:栈和队列。Java中实现队列一般都是用LinkedList实现。

这是因为LinkedList的实现是一个双向链表,所以无论是FIFO还是FILO都可以实现。

(1)初始化:

先看一下LinkedList的继承情况吧:

public class LinkedList<E>extends AbstractSequentialList<E>implements List<E>, Deque<E>, Cloneable, java.io.Serializable

然后看一下LinkedList的成员变量

transient int size = 0;
transient Node<E> first;
transient Node<E> last;

这就是我们很早学过的双向链表的实现基本要素。

看一下Node节点的定义,回忆一下双向链表,后边的操作就不再贴代码了,因为都是数据结构第一节课学的。

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

这里注意一下前面的修饰符 transient 关键字:

当对象被序列化时(写入字节序列到目标文件)时,transient阻止实例中那些用此关键字声明的变量持久化;当对象被反序列化时(从源文件读取字节序列进行重构),这样的实例变量值不会被持久化和恢复。

为什么要有这个关键字呢?因为我们要告诉虚拟机,这三个成员不是LinkedList的永久性变量。点到为止,后续在JVM的总结中会专门介绍一下各种关键字和虚拟机的关系。

(2)用作栈、队列和双向队列

对于这三种不同的数据结构的操作,LinkedList规定了6种基本动作。

getFirst()
getLast()
removeFirst()
removeLast()
addFirst()
addLast()

其中removeFirst()会调用unlinkFirst()函数,removeLast会调用unlinkLast()函数

下面看看是如何实现的栈和队列的功能。

用作栈:

public void push(E e) {addFirst(e);
}
public E pop() {return removeFirst();
}

View Code

用作队列:

public E peek() {final Node<E> f = first;return (f == null) ? null : f.item;
}
public E poll() {final Node<E> f = first;return (f == null) ? null : unlinkFirst(f);
}
public boolean offer(E e) {return add(e);
}

View Code

用作双端队列:

public boolean offerFirst(E e) {addFirst(e);return true;
}
public boolean offerLast(E e) {addLast(e);return true;
}
public E peekFirst() {if (size == 0)return null;return getFirst();
}
public E peekLast() {if (size == 0)return null;return getLast();
}
public E pollFirst() {if (size == 0)return null;return removeFirst();
}
public E pollLast() {if (size == 0)return null;return removeLast();
}

View Code

因为都是最简单的操作,都是望文生义的函数,所以就没写注释并且折叠代码了。

(3)其实没什么好写的

写完第二篇了,最大的感觉这些东西直接看文档就可以了,但是自己再看一遍源码也挺有趣,所以慢慢写吧,看一点写一点,从集合类到IO到并发到JVM,希望可以写完。

之前读了一本关于并发的书,最大的感慨就是数据结构太神奇,被各种思路使用的各种形式的数据结构,尤其是Disruptor使用的环形队列给惊艳到了。

读研以来,一直在看机器学习、并发编程和设计模式的知识,实验室项目从前端都后台到算法都尝试过,但是都不够深入,浮于表面,没什么用。

于是寒假反思了一下,开学又和晓晖聊了聊,感觉自己还是更适合做个软件工程师,而不是算法工程师。

所以趁着在学校,把一切都推倒重来,从零开始,夯实基础。

转载于:https://www.cnblogs.com/yueyanglou/p/5231901.html

Java集合之LinkedList相关推荐

  1. java集合框架LinkedList类的方法理解

    java提供的LinkedList类是双向列表,列表中的每个节点都包含了对前一个和后一个元素的引用. LinkedList与ArrayList一样实现List接口,只是ArrayList是List接口 ...

  2. JAVA 集合之 LinkedList

    LinkedList 前言 本文作为我学习 Java 集合 LinkedList 的一个记录与总结,如有疏漏或不足之处欢迎指出共同进步! 一.LinkedList 简介 1.1 LinkedList ...

  3. java集合:LinkedList

    队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作. LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用. LinkedLi ...

  4. 详解java集合之LinkedList——底层实现是头尾、双向节点,尽情地问我有没有看过集合源码吧!

    LinkedList底层实现--头尾.双向节点    LinkedList的类继承结构图 1. LinkedList对象的创建 1.1 参数为空的构造方法的方法体为空. 1.2 Collection对 ...

  5. Java集合之LinkedList常见实例操作,实例说明

    一.LinkedList常见操作 package List相关; /*** LinkedList 链接列表* LinkedList:底层使用的链表数据结构.特点:增删速度快,查询速度稍慢:*/impo ...

  6. 死磕 java集合之终结篇

    概览 我们先来看一看java中所有集合的类关系图. 这里面的类太多了,请放大看,如果放大还看不清,请再放大看,如果还是看不清,请放弃. 我们下面主要分成五个部分来逐个击破. List List中的元素 ...

  7. java 在数组末尾添加元素_Java集合05——LinkedList

    LinkedList介绍 public class LinkedList extends AbstractSequentialList implements List, Deque, Cloneabl ...

  8. Java 集合系列(4): LinkedList源码深入解析1

    戳上面的蓝字关注我们哦! 精彩内容 精选java等全套视频教程 精选java电子图书 大数据视频教程精选 java项目练习精选 概要 前面,我们已经学习了ArrayList,并了解了fail-fast ...

  9. Java集合 LinkedList的原理及使用

    1.LinkedList的概述 2.LinkedList的常用方法 3.LinkedList的三种便利方式 4.LinkedList的总结 1.LinkedList的概述 LinkedList和Arr ...

最新文章

  1. SQL连接:where子句与on子句
  2. EntityFramework之摸索EF底层(八)
  3. yii2 layout main.php,yii2 – 如何将参数传递给mainLayoutAsset.php文件?
  4. 电脑音响怎么插_【图片】汽车音响改装案例本田CRV改装德国HELIX汽车音响_汽车音响改装吧...
  5. IEnumerable和IQueryable的区别以及背后的ExpressionTree表达式树
  6. ibm服务器芯片架构,IBM x366 服务器技术详解
  7. Git missing Change-Id in commit message footer解决方法
  8. ssh 免密_大数据时代:SSH如何免密码登录?
  9. [backbone] Getting Started with Backbone.js
  10. excel如何拆分表格
  11. Yii Framework 开发教程Zii组件-Tabs示例
  12. mysql分区表 缓存_Mysql 分区表-分区操作
  13. C# System.Net.Mail 类 使用465端口邮件不成功
  14. OSChina 周一乱弹 —— 大爷上钩了
  15. 谷歌浏览器自带翻译失败解决方案
  16. 如何在微信 [[公众号]]添加小程序卡片
  17. p2p银行充值功能模块 支付宝调用
  18. 苹果手机解压缩软件_360压缩大师360 推出的免费 macOS 解压缩软件
  19. 基准测试神器 - JMH [ Java Microbenchmark Harness ]
  20. 如何对复杂的项目工作进行分解?

热门文章

  1. java深拷贝和浅拷贝介绍
  2. 写给新入行程序员的10条建议
  3. 操作系统基础:进程知识笔记(一)
  4. Shell脚本中函数位置参数的用法笔记
  5. ASP.NET Core Windows 环境配置 - ASP.NET Core 基础教程 - 简单教程,简单编程
  6. PHP GD库解析一张简单图片并输出
  7. 吴颖二:12.27 午评 地缘政治一波未平一波又起,千三可到?
  8. 数据库监控框架 oneproxy-monitor 开源了
  9. TODO-MVP-Loaders源码体验
  10. elasticsearch 5.1 问题 ubuntu