博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LinkedList简要分析
阅读量:5094 次
发布时间:2019-06-13

本文共 2375 字,大约阅读时间需要 7 分钟。

LinkedList概述

1430912-20190429231417934-1380311014.png

LinkedList 实现List接口,底层是双向链表,非线程安全。LinkedList还可以被当作堆栈、队列或双端队列进行操作。在JDK1.7/8 之后取消了循环,修改为双向链表。

  • LinkedList 实现 List 接口,能对它进行队列操作。
  • LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用。
  • LinkedList 实现了Cloneable接口,即覆盖了函数clone(),能被克隆。
  • LinkedList 实现java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输。
  • LinkedList 是非线程安全的。

源码分析

内部类Node,用于存储链表的节点信息

private static class Node
{ E item;//节点数据 Node
next;//后驱 Node
prev;//前驱 Node(Node
prev, E element, Node
next) { this.item = element; this.next = next; this.prev = prev; } }

构造方法

//构造一个空的list    public LinkedList() {    }    //用已有的集合创建链表的构造方法    public LinkedList(Collection
c) { this(); addAll(c); }

在首部添加数据

public void addFirst(E e) {        linkFirst(e);    }    private void linkFirst(E e) {        final Node
f = first; final Node
newNode = new Node<>(null, e, f); first = newNode; if (f == null) last = newNode; else f.prev = newNode; size++; modCount++; }

在末尾添加数据,add()方法和addLast()一样

public void addLast(E e) {        linkLast(e);    }    public boolean add(E e) {        linkLast(e);        return true;    }    void linkLast(E e) {        final Node
l = last; final Node
newNode = new Node<>(l, e, null); last = newNode; if (l == null) first = newNode; else l.next = newNode; size++; modCount++; }

根据索引获取数据

public E get(int index) {        checkElementIndex(index);        return node(index).item;    }    Node
node(int index) { // assert isElementIndex(index); if (index < (size >> 1)) { Node
x = first; for (int i = 0; i < index; i++) x = x.next; return x; } else { Node
x = last; for (int i = size - 1; i > index; i--) x = x.prev; return x; } }

上述代码,利用了双向链表的特性,如果index离链表头比较近,就从节点头部遍历。否则就从节点尾部开始遍历。使用空间(双向链表)来换取时间。node()会以O(n/2)的性能去获取一个结点,如果索引值大于链表大小的一半,那么将从尾结点开始遍历。这样的效率是非常低的,特别是当 index 越接近 size 的中间值时。

参考

转载于:https://www.cnblogs.com/my12/p/10793477.html

你可能感兴趣的文章
TreeSet—————我们认知的集合
查看>>
jquery消息插件(jquery.messager.js)
查看>>
留言区
查看>>
link 参数
查看>>
Center OS7网络设置
查看>>
GitHub入门
查看>>
selenium添加cookie切换到不同环境
查看>>
form表单自动回车提交
查看>>
虚机的部分操作
查看>>
Single
查看>>
Hyperledger02
查看>>
Java开发中的23种设计模式
查看>>
2014 Super Training #2 F The Bridges of Kolsberg --DP
查看>>
测试 code style
查看>>
电动车充电器原理及带电路图维修
查看>>
快速乘 防爆乘 快速幂
查看>>
Confluence 6 从外部目录中同步数据支持的目录类型
查看>>
【习题 6-5 UVA-1600】Patrol Robot
查看>>
【BZOJ 4516】生成魔咒
查看>>
深浅拷贝和数列,变量的区别
查看>>