LinkedList

在学习LinkedList之前应该先了解ArrayList
ArrayList用法
ArrayList的基本增删改查方法LinkedList都适用

常用方法

  1. 返回链表的第一个(最后一个)元素但不删除元素
    list.getFirst()-------list.getLast()
    list.peek()
    list.peekFirst()--------list.peekLast()
    list.element()
  2. 返回链表的第一个(最后一个)元素并且删除该元素
    list.pop()
    list.pollFirst()---------list.pollLast()
    list.poll()
  3. 在链表的第一个/最后一个位置添加元素
    list.offer()——返回true
    list.offerFirst()--------list.offerLast()——返回true
    list.push()
    list.addFirst()-----------list.addLast()
  4. 移除第一次出现的目标元素,如果移除则返回true,如果没有该元素则返回false
    list.removeFirstOccurrence()----------list.removeLastOccurrence()

这里主要将两者进行对比

效率对比

①当同时对向个数组末尾添加元素的时候,也就是用list.add()方法

public static void main(String[] args) {
	  List<Integer> arraylist=new ArrayList<Integer>();
	  List<Integer> linkedlist=new LinkedList<Integer>();
	  long t1=System.currentTimeMillis();
	  for (int i = 0; i < 200000; i++) {
	   arraylist.add(i);
	  }
	  long t2=System.currentTimeMillis();
	  System.out.println("在数组末尾插入二十万个数据,ArrayList所花的时间为:"+(t2-t1)+"ms");
	  long t3=System.currentTimeMillis();
	  for (int i = 0; i < 200000; i++) {
	   linkedlist.add(i);
	  }
	  long t4=System.currentTimeMillis();
	  System.out.println("在数组末尾插入二十万个数据,LinkedList所花的时间为:"+(t4-t3)+"ms");
	 }

在这里插入图片描述

可以看到,当在末尾添加元素的时候,两者效率几乎一样

②当同时对向个数组末尾添加元素的时候,也就是用list.add(index,element)方法

public static void main(String[] args) {
	  List<Integer> arraylist=new ArrayList<Integer>();
	  List<Integer> linkedlist=new LinkedList<Integer>();
	  long t1=System.currentTimeMillis();
	  for (int i = 0; i < 200000; i++) {
	   arraylist.add(0,i);
	  }
	  long t2=System.currentTimeMillis();
	  System.out.println("在指定位置插入二十万个数据,ArrayList所花的时间为:"+(t2-t1)+"ms");
	  long t3=System.currentTimeMillis();
 	  for (int i = 0; i < 200000; i++) {
   	  	linkedlist.add(0,i);
  		}
  	long t4=System.currentTimeMillis();
  	System.out.println("在指定位置插入二十万个数据,LinkedList所花的时间为:"+(t4-t3)+"ms");
 }

在这里插入图片描述

可以看到,当在指定位置插入元素得时候,ArrayList的效率就明显的低于LinkedList的效率了。所以,当程序中大量插入数据操作时,用LinkList更好

③随机查询比较,list.get(index)方法

public static void main(String[] args) {
	  List<Integer> arraylist=new ArrayList<Integer>();
	  List<Integer> linkedlist=new LinkedList<Integer>();
	  for (int i = 0; i < 20000000; i++) {
	   arraylist.add(i);
	  }
	  for (int i = 0; i < 20000000; i++) {
	   linkedlist.add(i);
	  }
	  long t1=System.currentTimeMillis();
	  System.out.println(arraylist.get(14346562));
	  long t2=System.currentTimeMillis();
	  System.out.println("查找指定位置的数,ArrayList所花的时间为:"+(t2-t1)+"ms");
	  long t3=System.currentTimeMillis();
  	  System.out.println(linkedlist.get(14346562));
  	  long t4=System.currentTimeMillis();
  	  System.out.println("查找指定位置的数,LinkedList所花的时间为:"+(t4-t3)+"ms");
 }

在这里插入图片描述

可以看到,当进行随机访问的时候,ArrayList相比LinkedList的效率是非常快的。

④删除元素 list.remove();

public static void main(String[] args) {
	  List<Integer> arraylist=new ArrayList<Integer>();
	  List<Integer> linkedlist=new LinkedList<Integer>();
	  for (int i = 0; i < 20000000; i++) {
	   arraylist.add(i);
	  }
	  for (int i = 0; i < 20000000; i++) {
	   linkedlist.add(i);
	  }
	  int i=15689;//这里用了很多数据
	  long t1=System.currentTimeMillis();
	  arraylist.remove(i);
	  long t2=System.currentTimeMillis();
	  System.out.println("删除指定位置的数,ArrayList所花的时间为:"+(t2-t1)+"ms");
	  long t3=System.currentTimeMillis();
	  linkedlist.remove(i);
	  long t4=System.currentTimeMillis();
	  System.out.println("删除指定位置的数,LinkedList所花的时间为:"+(t4-t3)+"ms");
 }

经过多次测试,发现两者的效率孰优孰劣并不是绝对的,两者的remove效率取决于元素所在的位置,当元素所在位置在数组靠前时,Linkedlist效率优于ArrayList,往后面,ArrayList的效率优于LinkedList。(这里不确定是否正确,自己测试的和书上说的有出入,希望有大佬能解决这个问题并给个权威的答复)

数据位置靠前时
数据位置靠近数组两端

数据位值靠后时
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值