LinkedList 源码分析

数据结构基础之双向链表

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表,如下图所示,同时下图也是LinkedList 底层使用的是双向循环链表数据结构。

现在我们来看下LinkedList的源码,集合类的作用就是存储数据然后取数据。所以我们就看下构造函数,插入,查找。

//构造函数
		LinkedList list=new LinkedList<>();
		//insert
		list.add("a");
		list.addFirst("fist");
		list.addLast("last");
		//search
		list.getFirst();
		list.get(1);
		list.getLast();

1,构造函数

    /**
     * Constructs an empty list.
     */
    public LinkedList() {
    }

我们可以看到构造函数里面什么都没有,就是一个空对象。我们看下它的属性,就三个

    transient int size = 0;

    /**
     * Pointer to first node.
     * Invariant: (first == null && last == null) ||
     *            (first.prev == null && first.item != null)
     */
    transient Node first;

    /**
     * Pointer to last node.
     * Invariant: (first == null && last == null) ||
     *            (last.next == null && last.item != null)
     */
    transient Node last;

size,没有注释,应该是集合中元素的个数,这个后面验证(事实上是的)。first头节点,last尾节点。我们看到这三个属性都加上了transient关键字。这是为什么呢?这个暂时没找到比较合适的解答,如果你知道的下方评论告诉我吧。

2.add方法

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

我自己这样理解的没有画图,相继插入 a,b,c

	插入a 
	l=null
	newnode=a
	last=a
	first=a
	
	插入b
	l=a
	newnode=b
	last=b
	a.next=b
	
	插入c
	l=b
	newnode=c
	last=c
	b.next=c
	链表结果:
	a->b->c

后面的几个方法都很简单,基本一看就会,不写啦。哈哈

 

 

你可能感兴趣的:(java集合类)