LinkedList

本贴最后更新于 2779 天前,其中的信息可能已经时过境迁

java.util.LinkedList

一、特点
1、允许元素为空;
2、允许元素重复;
3、元素有序;
4、非线程安全。

二、源码

public class LinkedList<E> extends AbstractSequantialList<E> implements List<E>, Deque<E>, cloneable, java.io.Serializable { /* * *************************节点************************************** */ private static class Node<E> { E item; Node<E> prev; Node<E> next; Node(Node<E> prev, E element, Node<E> next) { this.prev = prev; this.item = element; this.next = next; } } /* * *************************字段************************************** */ transient int size; transient Node<E> first; transient Node<E> last; /* * *************************构造器************************************ */ public LinkedList() {} public LinkedList(Collection<? extends E> c) { this(); addAll(c); } /* * **************************增************************************** */ // *******************实现List接口的方法****************************** // 在链表尾部添加一个元素 public boolean add(E e) { linkLast(e); return true; } void llinkLast(E e) { Node<E> l = last; Node<E> newNode = new Node(l, e, null); last = newNode; if (l == null) { first = newNode; } else { l.next = newNode; } size++; modCount++; } // 在指定的位置插入一个元素 public void add(int index, E e) { checkPositionIndex(index); // 范围是 0-size,如果是size相当于在尾部添加元素 if (index == size) { linkLast(e); } else { linkBefore(e, node(index)); } } void linkBefore(E e, Node<E> succ) { final Node<E> prev = succ.prev; final Node<E> newNode = new Node(prev, e, succ); succ.prev = newNode; if (prev == null) { first = newNode; // !!! } else { prev.next = newNode; } size++; modCount++; } // 在链表尾部添加一个集合 public boolean addAll(Collection<? extends E> c) { return addAll(size, c); } // 在指定的位置插入一个集合 public boolean addAll(int index, Collection<? extends E>) { checkPositionIndex(index); Object[] a = c.toArray(); int numNew = a.length; if (length == 0) { return false; } Node<E> pred; Node<E> succ; if (index == size) { pred = last; succ = null; } else { succ = node(index); pred = succ.prev; } for (Object o : a) { @SuppressWarnings("unchecked") E e = (E) o; Node<E> newNode = new Node(pred, e, null); if (pred == null) { first = newNode; } else { pred.next = newNode; } pred = newNode; } if (succ == null) { last = pred; } else { pred.next = succ; succ.prev = pred; } size += numNew; modCount++; return true; } // *******************实现Deque接口的方法****************************** // 在链表头部插入一个元素 public void addFirst(E e) // 在链表尾部添加一个元素 public void addLast(E e) // 在链表尾部添加一个元素(返回的是boolean) public boolean offer(E e) // 在链表头部插入一个元素(返回的是boolean) public boolean offerFirst(E e) // 在链表尾部添加一个元素(返回的是boolean) public boolean offerLast(E e) /* * **************************删************************************** */ /* * **************************查************************************** */ // 获取指定位置元素 public E get(int index) { checkElementIndex(index); return node(index).item; } /* * **************************改************************************** */ /* * ************************辅助方法************************************ */ // 检查下标是否越界 private void checkPositionIndex(int index) { if (!isPositionIndex(index)) { throw new IndexOutOfBoundsException(OutOfBoundsMsg(index)); } } // 检查下标是否存在 // 获取指定下标的节点 Node<E> node(int index) { if (index < (size >> 1)) { Node<E> x = first; for (int i = 0; i < index; i++) { x = x.next; } } else { Node<E> x = last; for (int i = size - 1; i > index; i--) { x = x.prev; } } } /* * ************************迭代器************************************ */ }

LinkedList 不是线程安全的,如果想使 LinkedList 变成线程安全的,可以使用如下方式:

List list=Collections.synchronizedList(new LinkedList(...));

参考:
LinkedList 源码
http://www.importnew.com/25023.html
http://blog.csdn.net/qq_19431333/article/details/54572876

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3201 引用 • 8216 回帖 • 4 关注
  • list
    10 引用 • 15 回帖

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    4 引用 • 7 回帖 • 3 关注
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 559 关注
  • OneNote
    1 引用 • 3 回帖 • 1 关注
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    81 引用 • 409 回帖
  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    198 引用 • 543 回帖 • 2 关注
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 110 关注
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 677 关注
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    151 引用 • 257 回帖 • 1 关注
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    32 引用 • 108 回帖
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    412 引用 • 3588 回帖
  • 浅吟主题

    Jeffrey Chen 制作的思源笔记主题,项目仓库:https://github.com/TCOTC/Whisper

    1 引用 • 28 回帖 • 3 关注
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    125 引用 • 585 回帖 • 1 关注
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    336 引用 • 324 回帖
  • 代码片段

    代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。

    用户在该标签下分享代码片段时需在帖子标题前添加 [css] [js] 用于区分代码片段类型。

    188 引用 • 1332 回帖
  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖 • 1 关注
  • PWA

    PWA(Progressive Web App)是 Google 在 2015 年提出、2016 年 6 月开始推广的项目。它结合了一系列现代 Web 技术,在网页应用中实现和原生应用相近的用户体验。

    14 引用 • 69 回帖 • 184 关注
  • Word
    13 引用 • 41 回帖 • 1 关注
  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖 • 5 关注
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖
  • OpenCV
    15 引用 • 36 回帖 • 6 关注
  • 电影

    这是一个不能说的秘密。

    122 引用 • 608 回帖
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    315 引用 • 547 回帖 • 1 关注
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    500 引用 • 1395 回帖 • 243 关注
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    98 引用 • 367 回帖
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖