Java集合方面的面试题:ArrayList和LinkedList有什么差别?分别适用于哪些场景?

第i号元素的位置 = 第0号元素的位置+(i-1)*每个元素的长度。

但数组不擅长添加和删除元素,比如要在长度是10000的数组里的500号位置添加一个元素,我们首先得让500到10000号元素都往后移动一位,先把500号位置腾出来,随后再添加。删除也是类似。

和数组相对应,链表比较擅长添加和删除元素(只需要更改其中一个元素的指针即可),但不擅长于定位(如果要找500号元素,就得从0号开始一个个找)。

这种说法应付面试尚可,但在实际项目里,往往没有单纯的添加(或删除)和单纯的查找操作,一般是两者配合使用。比如我们会在一个for循环里通过add方法从头开始在尾部添加元素,完成后在另个地方通过get方法从头开始获取元素,这两个动作往往会配对出现

那么在这种情况下,该选用哪种集合?下面我们来通过ListCompare.java来比较一下这两类List的各种性能,从而来归纳它们的使用场景。

1 //省略必要的import集合包的代码

2 public class ListCompare {

3 //在尾部添加元素

4 static void testAddatTail(List list,String type) {

5 int size = 1000000;

6 long start=System.currentTimeMillis();

7 //通过for循环在尾部添加元数据

8 for(int i = 0;i<size;i++)

9 {list.add(i);}

10 long end=System.currentTimeMillis();

11 System.out.println("testAddatTail for " + type);

12 //结束时间减开始时间就是运行时间

13 System.out.println(end - start);

14 }

15 //随机查找元素

16 static void testRandomSearch(List list,String type) {

17 Random rand = new Random();

18 long start=System.currentTimeMillis();

19 //在for循环里随机查找元素

20 for(int i = 0;i<10000;i++)

21 {list.indexOf(rand.nextInt(100000));}

22 long end=System.currentTimeMillis();

23 System.out.println("testRandomSearch for " + type);

24 System.out.println(end - start);

25 }

26 //随机地添加元素

27 static void testAddatRandom(List list,String type){

28 Random rand = new Random();

29 long start=System.currentTimeMillis();

30 for(int i = 0;i<1000;i++)

31 {list.add(rand.nextInt(100000), “0”);}

32 long end=System.currentTimeMillis();

33 System.out.println("testAddatRandom for " + type);

34 System.out.println(end - start);

35 }

36 //主方法

37 public static void main(String[] args) {

38 //创建两种不同类型的List

39 List arrayList = new ArrayList();

40 List linkedList = new LinkedList();

41 //如下是对比实现

42 testAddatTail(arrayList,“ArrayList”);

43 testAddatTail(linkedList,“LinketList”);

44 testAddatRandom(arrayList,“ArrayList”);

45 testAddatRandom(linkedList,“LinketList”);

46 testRandomSearch(arrayList,“ArrayList”);

47 testRandomSearch(linkedList,“LinketList”);

48 }

49 }

在下表3.1里,我们列出了在上述代码里定义的方法。

表3.1 针对两种不同集合对比测试方法归纳表

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。实际上,作为程序员,丰富自己的知识储备,提升自己的知识深度和广度是很有必要的。

Mybatis源码解析

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

[外链图片转存中…(img-TgA8R6up-1713311741432)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值