深入理解LinkedList

简要介绍

  • LinkedList 是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。
  • LinkedList 实现 List 接口,能对它进行队列操作。
  • LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用。
  • LinkedList 实现了Cloneable接口,即覆盖了函数clone(),能克隆。
  • LinkedList 实现java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输。
  • LinkedList和ArrayList同样是非线程安全的,只在单线程下适合使用。

源码

使用

 public static void main(String[] args) {
        //add操作
        list.add(0);
        list.add(5);
        list.addFirst(1);
        list.add(2, 2);
        list.addLast(3);
        System.out.println("list: " +list);

        //get操作
        System.out.println("list.getFirst():"+list.getFirst());
        System.out.println("list.getLast():"+list.getLast());
        System.out.println("list.get(2):"+list.get(2));

        //remove操作
        System.out.println("list.remove():"+list.remove());
        System.out.println("list.remove(2):"+list.remove(2));
        System.out.println("list.removeFirst():"+list.removeFirst());
        System.out.println("list.removeLast():"+list.removeLast());
        System.out.println("after list remove: " +list);

        //peek操作
        System.out.println("list.peek():"+list.peek());
        System.out.println("list.peekFirst():"+list.peekFirst());
        System.out.println("list.peekLast():"+list.peekLast());
        System.out.println("after list peek: " +list);

        //offer操作
        System.out.println("list.offer(6):"+list.offer(6));
        System.out.println("list.offerLast(9):"+list.offerLast(9));
        System.out.println("list.offer(10):"+list.offer(10));
        System.out.println("list.offerFirst(7):"+list.offerFirst(7));
        System.out.println("list.offerLast(8):"+list.offerLast(8));
        System.out.println("after list offer: " +list);

        //poll操作
        System.out.println("list.poll():"+list.poll());
        System.out.println("list.pollFirst():"+list.pollFirst());
        System.out.println("list.pollLast():"+list.pollLast());
        System.out.println("after list poll: " +list);

        //push操作
        list.push(11);
        System.out.println("after list push: " +list);

        //pull
        list.pop();
        System.out.println("after list pop: " +list);

        //set
        list.set(2, 12);
        System.out.println("after list set: " +list);

        //for循环遍历
        System.out.println("for循环遍历");
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i)+" ");
        }
        System.out.println("");

        //迭代器
        System.out.println("迭代器遍历");
        Iterator<Integer> iter = list.iterator();
        while(iter.hasNext()){
            System.out.print(iter.next()+" ");
        }
        System.out.println("");

        //foreach 遍历
        System.out.println("foreach 遍历");
        for(Integer i : list){
            System.out.print(i+" ");
        }
        System.out.println("");
    }

/****************************打印如下*************************
list: [1, 0, 2, 5, 3]
list.getFirst():1
list.getLast():3
list.get(2):2
list.remove():1
list.remove(2):5
list.removeFirst():0
list.removeLast():3
after list remove: [2]
list.peek():2
list.peekFirst():2
list.peekLast():2
after list peek: [2]
list.offer(6):true
list.offerLast(9):true
list.offer(10):true
list.offerFirst(7):true
list.offerLast(8):true
after list offer: [7, 2, 6, 9, 10, 8]
list.poll():7
list.pollFirst():2
list.pollLast():8
after list poll: [6, 9, 10]
after list push: [11, 6, 9, 10]
after list pop: [6, 9, 10]
after list set: [6, 9, 12]
for循环遍历
6 9 12 
迭代器遍历
6 9 12 
foreach 遍历
6 9 12 
*******************************************************/

重点总结

1.LinkedList是通过双向链表的,但是它也实现了List接口{也就是说,它实现了get(int location)、remove(int location)等“根据索引值来获取、删除节点的函数”}。LinkedList通过一个计数索引值来实现的。例如,当我们调用get(int location)时,首先会比较“location”和“双向链表长度的1/2”;若前者大,则从链表头开始往后查找,直到location位置;否则,从链表末尾开始先前查找,直到location位置。这就是“双线链表和索引值联系起来”的方法。

2.在查找和删除某元素时,源码中都划分为该元素为null和不为null两种情况来处理,LinkedList中允许元素为null。

3.LinkedList是基于链表实现的,因此插入删除效率高,查找效率低。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值