一天一个java知识(深入了解LinkedList和ArrayList区别)

早在大二java基础课程上,便有一些深入的了解,list会继承两个接口:

  1. LinkedList
  2. ArrayList
    那么这两者有什么异同呢
    首先是代码测试:
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import bean.Answer;
import bean.User;

/**
 * 测试类
 * 
 * @author hxz
 *
 */
public class MyTestUtil {
	
	public static void addTest(List<String> list) {
		System.out.println(list.getClass().getName() + "开始查询");
		long start = System.currentTimeMillis();
		System.out.println("开始时间:" + start);
		list.add("需要查找的数据");
		list.add("eeee");
		list.add("aaee");
		list.add("abbb");
		for (int i = 0; i < 10000000; i++) {
			for (int j = 0; j < list.size(); j++) {
				list.get(j).contains("e");
				System.out.print("");
			}
		}
		long end = System.currentTimeMillis();
		System.out.println("结束时间:" + end);
		System.out.println("总耗时:" + (end - start));
	}

	public static void main(String[] args) {
		List<String> a = new ArrayList<>();
		List<String> b = new LinkedList<>();
		addTest(a);
		addTest(b);
	}
}

在这里插入图片描述

???不是说ArrayList查询快于LinkedList么?

然后我们测试增加
在这里插入图片描述

???简直颠覆我的认知!

难道我学的都是错的吗?
事情的真相只有一个!
首先我们需要了解
linkedLIst是双向链表结构
链表结构图
这就决定了LinkedList不支持高效的随机元素访问
我写的测试程序有个最大的问题就是!随机访问,
元素之间的所有关系是通过引用关联的,就好比最近特别火的从袖子里撤出棒棒糖来的情景,想要撤出下一个就必须撤出上一个。它在查询的时候,只能一个一个的遍历查询,所以他的查询效率很低,如果我们想删除一节车厢怎么办呢?就相当于自行车的链子,有一节坏了,我们是不是直接把坏的那节仍掉,然后让目标节的上一节指向目标节的下一节,但是,

ArrayList是数组结构
数组结构图

就是有相同特性的一组数据的箱子,比如说我有一个能容下10个苹果的箱子,我现在只放了5个苹果,那么放第6个是不是直接放进去就行了?呢我要放11个呢?这个箱子是不是放不下了?所以我是不是需要换个大点的箱子?这就是数组的扩容!同样,我们一般放箱子里面的东西是不是按照顺序放的?假如说是按abcd的顺序放的,我突然想添加一个e,这个e要放到c的后面,你是不是需要把d先拿出来,再把e放进去,再把d放进去?假如说c后面有10000个呢?你是不是要把这10000个都拿出来,把e放进去,再放这10000个?效率是不是很低了?所以,理论上它的增删比较慢!但是前面也说了,我们箱子里面放东西,都是按照顺序放的,所以我知道其中一个"地址",是不是就知道所有元素的地址?所以它的查询在理论上比较快!

只是在在list容量较大情况下,ArrayList查询数据要远优于LinkedList,

看我的代码中,list只有几个元素
现在我改了一下:

在这里插入图片描述
在这里插入图片描述

总结

ArrayList和LinkedList在性能上各有优缺点,都有各自所适用的地方,总的说来可以描述如下:

  1. 对ArrayList而言,主要是在内部数组中增加一项数据,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是统一的,分配一个内部对象。
  2. 在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。
  3. LinkedList不支持高效的随机元素访问
  4. 只是在在list容量较大情况下,ArrayList查询数据要远优于LinkedList
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值