Java容器_List_LinkedList源码分析
来源:互联网 发布:奕乐麻将 嘉兴玩网络 编辑:程序博客网 时间:2024/05/22 14:59
LinkedList类是List的双向链表实现,双向链表是一种数据结构,就是每个对象都记录上一个对象的位置,同时也记录下一个对象的位置,这样,能够方便的查找每一个对象前面的对象和后面的对象,方便数据的增加和删除。
对于双向链表列表而言,所有的操作都是这样执行的,从头开始遍历,当找到指定的索引后,关闭列表。
特别强调一下,LinkedList不是线程安全的等等。
双向链表在最后增加新元素:
看源码:
public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable{ transient int size = 0; /** * Pointer to first node. * Invariant: (first == null && last == null) || * (first.prev == null && first.item != null) */ transient Node<E> first; /** * Pointer to last node. * Invariant: (first == null && last == null) || * (last.next == null && last.item != null) */ transient Node<E> last; /** * Constructs an empty list. */ public LinkedList() { }翻译一下这个类的描述,双向链表列表实现了List和Deque接口,实现了List的所有方法和允许所有的元素。
对于双向链表列表而言,所有的操作都是这样执行的,从头开始遍历,当找到指定的索引后,关闭列表。
特别强调一下,LinkedList不是线程安全的等等。
好了,不看了,直接看实现吧,学过数据结构的都知道双向链表的实现,应该还都是pascle的代码吧,现在看看java的实现。
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; } }是一个静态内部类,我们刚说过静态内部类用的不多,没想到这么快就在这里见到了,定义了内容,下一个节点,上一个节点,三个属性和一个构造函数。
双向链表在最后增加新元素:
/** * Appends the specified element to the end of this list. * * <p>This method is equivalent to {@link #addLast}. * * @param e element to be appended to this list * @return {@code true} (as specified by {@link Collection#add}) */ public boolean add(E e) { linkLast(e); return true; } /** * Links e as last element. */ void linkLast(E e) { final Node<E> l = last; final Node<E> newNode = new Node<>(l, e, null); last = newNode; // 新创建的节点指向last变量 if (l == null) // 如果是第一个节点 first = newNode; //新创建的节点指向first else l.next = newNode; // 原节点的下一个节点指向新创建的节点 size++; modCount++; }
双向链表在指定index增加新元素,先看图,了解一下操作:
再看代码:
/** * Inserts the specified element at the specified position in this list. * Shifts the element currently at that position (if any) and any * subsequent elements to the right (adds one to their indices). * * @param index index at which the specified element is to be inserted * @param element element to be inserted * @throws IndexOutOfBoundsException {@inheritDoc} */ public void add(int index, E element) { checkPositionIndex(index); if (index == size) linkLast(element); else linkBefore(element, node(index)); } /** * Inserts element e before non-null Node succ. */ 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; else pred.next = newNode; size++; modCount++; }就是简单的链表操作,理解了LinkedList的实现,我们对这个类应该有点了解了,双向链表适合修改数据效率高。
0 0
- Java容器_List_LinkedList源码分析
- Java容器_Map_HashMap源码分析
- Java容器_Set_HashSet源码分析
- java并发容器ConcurrentHashMap源码分析
- Java容器(三):LinkedList源码分析
- Java容器(七):TreeMap源码分析
- Java concurrent Framework并发容器之CopyOnWriteArrayList(1.6)源码分析
- Java concurrent Framework并发容器之ArrayBlockingQueue(1.6)源码分析
- Java concurrent Framework并发容器之ConcurrentLinkedQueue(1.6)源码分析 ??
- java 容器类研究一:HashMap源码原理分析
- java容器类源码分析——ArrayList
- [Java容器]HashMap实现原理和源码分析
- JAVA 实现容器源码
- java容器源码
- java容器源码解析
- Java容器源码解析
- SPRING源码分析:IOC容器
- 【spring源码分析】-容器基础
- 欢迎使用CSDN-markdown编辑器
- 在Ubuntu15.0版本上安装vpn服务时遇到的问题记录
- c++ 多重继承(包含虚继承)重载operator==
- 进程间通信的方式有哪些?各自的优缺点及应用选择?
- 蓝桥杯:颠倒的价牌
- Java容器_List_LinkedList源码分析
- 洛谷P1417:优先级与背包问题
- 结合arcgis api for js进行PIO搜索
- Jfinal之 poi render
- PAT 乙级 1024. 科学计数法 (20)
- 系统防刷的一些基本方法
- 姿态解算
- Oil Deposits(dfs)HDU
- maven常用命令