Java从入门到放弃(九)集合框架之LinkedList源码(2)

原创 2018年04月15日 14:46:42

    上一篇Java从入门到放弃(八)集合框架之LinkedList源码(1)介绍了add和remove方法,这篇介绍LinkedList的set,get等方法。

1、get方法

public E get(int index) {
        checkElementIndex(index);
        return node(index).item;
    }

方法很简单,就是一个越界检查,然后调用node(index)方法获取对应的节点,然后返回节点的item。node(index)方法和链表结构上一篇已经讲过了,这里不再讲解。

2、set方法

public E set(int index, E element) {
        checkElementIndex(index);    //越界检查
        Node<E> x = node(index);     //获取对应节点
        E oldVal = x.item;           
        x.item = element;            //节点item指向新的元素
        return oldVal;
    }

这里还是使用了node(index)方法,把对应节点的item数据更改为新的元素,返回旧的元素。

3、pop(),push(),offer(),peek(),poll()方法

pop删除第一个节点并返回

public E pop() {
        return removeFirst();
    }
看一下removeFirst方法
   public E removeFirst() {
        final Node<E> f = first;
        if (f == null)
            throw new NoSuchElementException();
        return unlinkFirst(f);
    }
    private E unlinkFirst(Node<E> f) {
        // assert f == first && f != null;
        final E element = f.item;    
        final Node<E> next = f.next;   //获取first的next节点,即第二个节点
        f.item = null;
        f.next = null; // help GC
        first = next;                  //将first指向第二个节点
        if (next == null)              
            last = null;
        else
            next.prev = null;
        size--;
        modCount++;
        return element;
    }

就是把头节点删除,first指向第二个节点。

push:在链表头加入一个元素,不返回

public void push(E e) {
        addFirst(e);
    }
	public void addFirst(E e) {
        linkFirst(e);
    }
	private void linkFirst(E e) {
        final Node<E> f = first;
        final Node<E> newNode = new Node<>(null, e, f);   //新的节点,next指向first的节点
        first = newNode;                                  //first指向新的节点
        if (f == null)
            last = newNode;
        else
            f.prev = newNode;                              //f的perv节点指向新节点
        size++;
        modCount++;
    }

在开头加入一个节点,就是把first节点指向新的节点,然后把之前的first节点f的perv引用指向新节点。

offer:链表尾部增加元素,返回添加结果

public boolean offer(E e) {
        return add(e);  
    }
就是调用了add(e)方法,具体实现看上一篇博文。
peek:返回头部元素
public E peek() {
        final Node<E> f = first;
        return (f == null) ? null : f.item;
    }
返回first节点的item元素。没有九返回null;
poll:删除第一个节点并返回
public E poll() {
        final Node<E> f = first;
        return (f == null) ? null : unlinkFirst(f);
    }
和pop作用一样,区别就是pop如果没有第一个元素会抛出异常。

LinkedList除了这几个还有removeLast(),pollLast()等方法,所以可以很容易的用LinkedList实现一个队列或者栈的结构。

4、clear,size,isEmpty

public void clear() {
        // Clearing all of the links between nodes is "unnecessary", but:
        // - helps a generational GC if the discarded nodes inhabit
        //   more than one generation
        // - is sure to free memory even if there is a reachable Iterator
        for (Node<E> x = first; x != null; ) {
            Node<E> next = x.next;
            x.item = null;
            x.next = null;
            x.prev = null;
            x = next;
        }
        first = last = null;
        size = 0;
        modCount++;
    }

size方法和isEmpty就不贴代码了,size()就是返回size属性,isEmpty就是判断size是否等于0,

clear方法和ArrayList方法类似,就是把所有元素和引用都置为null,便于GC。

5、迭代器

  和ArrayList不一样的是,iterator方法返回的是listIterator;这个方法是从AbstractSequentialList继承而来。

public Iterator<E> iterator() {
        return listIterator();
    }
关于listIterator和Iterator的区别具体看Java从入门到放弃(七)集合框架之ArrayList的坑

6、LinkedList和ArrayList的不同

     LinkedList是基于双向链表实现的,各个节点直接的通过next和perv来连接,与数组不同,ArrayList的数组结构使得ArrayList可以通过索引快速访问元素,包括查询和修改,时间复杂度O(1),但是不便于添加和删除,因为每次添加或者删除要移动目标节点后的所有元素。而LinkedList基于链表结构,可以很快的进行添加和删除,只是把对应的next和perv更改就实现了添加删除,但是在查询和更改的时候,会比较慢,因为需要从first(或者last)遍历链表。

       在查询和更改比较多的情况下使用ArrayList,在增加、删除比较多的情况下使用LinkedList.

一位程序员工作10年总结的13个忠告,却让很多人惋惜

一位程序员工作10年总结的13个忠告,却让很多人惋惜 程序员 21CTO社区 · 2015-10-28 00:00 展望未来,总结过去10年的程序员生涯,给程序员小弟...
  • qq907384382
  • qq907384382
  • 2016-02-10 22:31:13
  • 4708

写给想当程序员的朋友 一个还不太老的普通程序员的体会

软件以程序员为本————《程序员》  谨以此文献给所有想当程序员的朋友 (一) 文章由来及个人经历 我是一名计算机专业的本科毕业生,毕业已经1年多了。毕业后从事的是软件编程工作,经常有其他专业的朋友想...
  • phphot
  • phphot
  • 2008-01-04 11:22:00
  • 1050

JAVA 从入门到放弃?

这是博客里的第一篇文章。主要是介绍一下我从JAVA零基础到工作四个月之间这一段事情。后面会陆续写一些工作之中用到的一些东西和记录一些自己学习相关技术的文章。目的是为能够跟别人一起多交流分享学习经验,共...
  • HelloWorld_In_Java
  • HelloWorld_In_Java
  • 2016-11-12 13:58:43
  • 14915

java从入门到放弃

人类从类人猿一步步进化到今天,成为高级动物,除了人类拥有高智商外,更离不开语言,从最初的石头或绳结计数,到后来渐渐的发明了文字,也有了语言,一直延续至今。...
  • java_rumendaofangqi
  • java_rumendaofangqi
  • 2017-07-26 14:47:06
  • 904

一个牛人给java初学者的建议

 给初学者之一:浅谈java及应用 学java不知不觉也已经三年了 从不知java为何物到现在一个小小的j2ee项目经理 虽说不上此道高手,大概也算有点斤两了吧 每次上网,泡bbs逛论坛,没少去jav...
  • phphot
  • phphot
  • 2008-03-11 23:12:00
  • 25687

JavaWeb开发入门(二)

web应用程序web应用程序指供浏览器访问的程序,通常也简称为web应用。 web应用:例如有a.html 、b.html…..多个web资源,这多个web资源用于对外提供邮件服务,此时应把这多个w...
  • yerenyuan_pku
  • yerenyuan_pku
  • 2016-07-06 08:30:31
  • 2080

【Java8源码分析】集合框架-LinkedList

一、总结(1)LinkedList有两个构造参数,一个为无參构造,只是新建一个空对象,第二个为有参构造,新建一个空对象,然后把所有元素添加进去。(2)LinkedList的存储单元为一个名为Node的...
  • linxdcn
  • linxdcn
  • 2017-05-02 16:22:50
  • 471

10分钟JAVA从入门到放弃

10分钟JAVA从入门到放弃author:AIDreamerblog:http://blog.csdn.net/mmy1996last modified on :2016/12/12面向对象的三大特征...
  • mmy1996
  • mmy1996
  • 2016-12-14 20:28:34
  • 4614

老程序员给初学者的一些建议和忠告

网上看到的一篇好文章,自己当年没有读到是损失,现在希望更多的师弟师妹因为这篇文章避免这个损失! 请记住——我不会以码农自卑,但一定以常年码农为耻!...
  • a_running_wolf
  • a_running_wolf
  • 2015-11-15 00:33:15
  • 2947

程序员的酸甜苦辣——告别Coding

程序员的酸甜苦辣——告别Codingdocument.title="程序员的酸甜苦辣——告别Coding - "+document.title 毕业找工作时,我曾对朋友说:“程序员这个称谓,是一个荣誉...
  • sad_4978
  • sad_4978
  • 2005-10-11 09:08:00
  • 15999
收藏助手
不良信息举报
您举报文章:Java从入门到放弃(九)集合框架之LinkedList源码(2)
举报原因:
原因补充:

(最多只允许输入30个字)