第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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
总结
我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。实际上,作为程序员,丰富自己的知识储备,提升自己的知识深度和广度是很有必要的。
Mybatis源码解析
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
[外链图片转存中…(img-TgA8R6up-1713311741432)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!