Java集合框架——list(LinkedList)

一:LinkedList是List的另一个重要的实现类

(常用方法,遍历等参照ArrayList上篇)

记录一下LinkedList与ArrayList不一样的地方。

二:LinkedList除了实现了List接口外,LinkedList还实现了双向链表结构Deque。

(1)Deque:可以很方便的在头尾插入删除数据。

(2)什么是链表结构: 与数组结构相比较,数组结构,就好像是电影院,每个位置都有标示,每个位置之间的间隔都是一样的。 而链表就相当于佛珠,每个珠子,只连接前一个和后一个,不用关心除此之外的其他佛珠在哪里。

(3)什么是双向链表结构:

代码:用LinkedList实现双向链表的结构的代码。

package collection;

import java.util.LinkedList;

import charactor.Hero;

public class TestCollection {

    public static void main(String[] args) {
        
        //LinkedList是一个双向链表结构的list
        LinkedList<Hero> ll =new LinkedList<Hero>();
        
        //所以可以很方便的在头部和尾部插入数据
        //在最后插入新的英雄
        ll.addLast(new Hero("hero1"));
        ll.addLast(new Hero("hero2"));
        ll.addLast(new Hero("hero3"));
        System.out.println(ll);
        
        //在最前面插入新的英雄
        ll.addFirst(new Hero("heroX"));
        System.out.println(ll);
        
        //查看最前面的英雄
        System.out.println(ll.getFirst());
        //查看最后面的英雄
        System.out.println(ll.getLast());
        
        //查看不会导致英雄被删除
        System.out.println(ll);
        //取出最前面的英雄
        System.out.println(ll.removeFirst());
        
        //取出最后面的英雄
        System.out.println(ll.removeLast());
        
        //取出会导致英雄被删除
        System.out.println(ll);
        
    }
     
}


 

三:LinkedList 除了实现了List和Deque外,还实现了Queue接口(队列)。
Queue是先进先出队列 FIFO,常用方法:
offer 在最后添加元素
poll 取出第一个元素
peek 查看第一个元素

代码:用LInkedList实现队列的代码。

package collection;
 
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
 
import charactor.Hero;
 
public class TestCollection {
 
    public static void main(String[] args) {
        //和ArrayList一样,LinkedList也实现了List接口
        List ll =new LinkedList<Hero>();
         
        //所不同的是LinkedList还实现了Deque,进而又实现了Queue这个接口
        //Queue代表FIFO 先进先出的队列
        Queue<Hero> q= new LinkedList<Hero>();
         
        //加在队列的最后面
        System.out.print("初始化队列:\t");
        q.offer(new Hero("Hero1"));
        q.offer(new Hero("Hero2"));
        q.offer(new Hero("Hero3"));
        q.offer(new Hero("Hero4"));
         
        System.out.println(q);
        System.out.print("把第一个元素取poll()出来:\t");
        //取出第一个Hero,FIFO 先进先出
        Hero h = q.poll();
        System.out.println(h);
        System.out.print("取出第一个元素之后的队列:\t");
        System.out.println(q);
         
        //把第一个拿出来看一看,但是不取出来
        h=q.peek();
        System.out.print("查看peek()第一个元素:\t");
        System.out.println(h);
        System.out.print("查看并不会导致第一个元素被取出来:\t");
        System.out.println(q);
         
    }
      
}


 

四:ArrayList 与 LinkedList的区别

1:(从插入删除的速度上区别)ArrayList 插入,删除数据慢,LinkedList, 插入,删除数据快。

2:(从数据结构上的区别)

——ArrayList是顺序结构,所以定位很快,指哪找哪。 就像电影院位置一样,有了电影票,一下就找到位置了。

——LinkedList 是链表结构,就像手里的一串佛珠,要找出第99个佛珠,必须得一个一个的数过去,所以定位慢

3:代码:比较ArrayList和LinkedList插入数据

public class a {
    public static void main(String[] args){
        List<Integer> l;

        l=new ArrayList<>();
        insertFirst(l,"ArrayList");

        l=new LinkedList<>();
        insertFirst(l,"LinkedList");
    }
    private static void insertFirst(List<Integer> l,String type){
        int total=1000*100;
        final int number=5;
        long start=System.currentTimeMillis();
        for(int i=0;i<total;i++){
            l.add(0,number);
        }
        long end=System.currentTimeMillis();
        System.out.printf("在%s 最前面插入%d条数据,总共耗时 %d 毫秒 %n",type,total,end - start);
    }
}

4:代码:比较ArrayList和LinkedList定位数据

public class a {
    public static void main(String[] args){
        List<Integer> l;

        l=new ArrayList<>();
        modify(l,"ArrayList");

        l=new LinkedList<>();
        modify(l,"LinkedList");
    }
    private static void modify(List<Integer> l,String type){
        int total=1000*100;
        int index=total/2;
        final int number=5;
        for(int i=0;i<total;i++){
            l.add(number);
        }
        long start=System.currentTimeMillis();
        for(int i=0;i<total;i++){
            int n=l.get(index);
            n++;
            l.set(index,n);
        }
        long end=System.currentTimeMillis();
        System.out.printf("%s总长度是%d,定位到第%d个数据,取出来,加1," +
                "再放回去 重复%d遍,总共耗时 %d 毫秒 %n",
                type,total, index,total, end - start);
        System.out.println();

        
    }
}

运行结果:


 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值