关键词搜索

源码搜索 ×
×

Java集合框架:LinkedList

发布2016-03-17浏览4217次

详情内容


欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。


欢迎跳转到本文的原文链接:https://honeypps.com/java/java-collection-linkedlist/

LinkedList定义

package java.util;
public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable{
    transient int size = 0;
    transient Node<E> first;
    transient Node<E> last;
}

    LinkedList概述

      LinkedList以双向链表实现,允许重复。(如下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;
            }
        }
    
      9
    • 10
    • 11

      链表无容量限制,但双向链表本身使用了更多空间,也需要额外的链表指针操作
      按下标访问元素—get(i)/set(i,e) 要悲剧的遍历链表将指针移动到位(如果i>数组大小的一半,会从末尾移起)

        public E get(int index) {
            checkElementIndex(index);
            return node(index).item;
        }
        public E set(int index, E element) {
            checkElementIndex(index);
            Node<E> x = node(index);
            E oldVal = x.item;
            x.item = element;
            return oldVal;
        }
        
        Node<E> node(int index) {
            // assert isElementIndex(index);
    
            if (index < (size >> 1)) {
                Node<E> x = first;
                for (int i = 0; i < index; i++)
                    x = x.next;
                return x;
            } else {
                Node<E> x = last;
                for (int i = size - 1; i > index; i--)
                    x = x.prev;
                return x;
            }
        }
    
      9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

      插入、删除元素时修改前后节点的指针即可,但还是要遍历部分链表的指针才能移动到下标所指的位置,只有在链表两头的操作—add(), addFirst(),removeLast()或用iterator()上的remove()能省掉指针的移动
      非线程安全,可以调用Collections.synchronizedList(new LinkedList<>());实现。


    LinkedList用法

      简单举个例子:

    		List<Integer> list = new LinkedList<>();
            list.add(4);
            list.add(2);
            list.add(3);
            list.add(5);
    
            for(int i:list)
                System.out.println(i);
            System.out.println(list);
    
      9

      运行结果:

    4
    2
    3
    5
    [4, 2, 3, 5]
    
    • 1
    • 2
    • 3
    • 4
    • 5

      LinkedList会保留插入数据的顺序。


    subList的使用

    		List<Integer> list = new LinkedList<>();
            list.add(4);
            list.add(2);
            list.add(3);
            list.add(5);
            list.add(7);
            list.add(5);
            list.add(11);
            list.add(14);
            list.add(10);
            list.add(9);
            System.out.println(list);
            List<Integer> list2 = list.subList(3, 6);
            System.out.println(list2);
            list2.set(2, 50);
    
            System.out.println("============");
            System.out.println(list);
            System.out.println(list2);
    
      9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

      运行结果:

    [4, 2, 3, 5, 7, 5, 11, 14, 10, 9]
    [5, 7, 5]
    ============
    [4, 2, 3, 5, 7, 50, 11, 14, 10, 9]
    [5, 7, 50]
    
    • 1
    • 2
    • 3
    • 4
    • 5

      调用LinkedList中的subList方法生成的新的list,内部引用的还是原来的链表,如果改变subList中的值,主list中的值也会跟着改变。


    参考资料

    1. 关于Java集合的小抄

    欢迎跳转到本文的原文链接:https://honeypps.com/java/java-collection-linkedlist/


    欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。


    相关技术文章

    点击QQ咨询
    开通会员
    返回顶部
    ×
    微信扫码支付
    微信扫码支付
    确定支付下载
    请使用微信描二维码支付
    ×

    提示信息

    ×

    选择支付方式

    • 微信支付
    • 支付宝付款
    确定支付下载