人物背景:老徐,男,本名徐富贵,从事Java相关研发多年,职场老手,青年专家。钓鱼。徐。据说他之前因为炒某币而输光了所有家产,现在还负债累累。阿珍,女,本名陈家珍,是一名刚入职的实习生。虽然是职场新人,但她聪明好学。据说她是校内四大美女之一,追求者从旺角排到铜锣湾,但至今仍单身。老徐问:“阿震,你知道ArrayList和LinkedList的区别吗?”阿震微微一笑,说道:“这太幼稚了,ArrayList是基于数组实现的,LinkedList是基于链表实现的。”竖起大拇指,说:“不错,有进步!那你知道ArrayList和LinkedList哪个效率更高吗?”Zhen回复:“这个对我来说不是问题,要看不同的情况。当添加或删除元素时,遍历时,LinkedList的效率高于ArrayList,而遍历时,ArrayList的效率高于链表。”老徐反问:“不一定。在添加和删除元素的时候,LinkedList的效率可能比ArrayList低,在遍历的时候,ArrayList的效率可能比LinkedList低。”阿珍答道:“不可能,绝对不可能,书上写的。”老徐得意一笑,道:“实践是检验真理的唯一标准,趁老大不在,我们写个程序,实践一下吧。”》ArrayList和LinkedList新增元素的比较首先写一段代码,计算新增元素的耗时:/***从List的头部开始新增元素*@paramlistlist*@paramcount的新元素的数量*@return花费的时间(单位:ms)*/publicstaticlongaddHeader(Listlist,intcount){longstart=System.nanoTime();for(inti=0;ilist,intcount){longstart=System.nanoTime();for(inti=0;ilist,intcount){longstart=System.nanoTime();对于(整数我=0;我<计数;i++){list.add("onemore-"+i);}longend=System.nanoTime();return(end-start)/1000000;}然后,我们把新元素的个数设置为50000,用于比较:publicstaticvoidmain(String[]args){intcount=50000;System.out.println("从ArrayList头部开始添加新元素:"+addHeader(newArrayList<>(count),count)+"ms");System.out.println("从链表头部添加新元素:"+addHeader(newLinkedList<>(),count)+"ms");System.out.println("从ArrayList的中间添加元素:"+addMiddle(newArrayList<>(count),count)+"ms");System.out.println("从LinkedList中间添加元素:"+addMiddle(newLinkedList<>(),count)+"ms");System.out.println("从ArrayList的尾部添加元素:"+addTail(newArrayList<>(count),count)+"ms");系统。out.println("从LinkedList尾部开始添加新元素:"+addTail(newLinkedList<>(),count)+"ms");}运行结果如下:ArrayList从头开始从底部添加元素:204msLinkedList从头部添加元素:17msArrayList从中间添加元素:71msLinkedList从中间添加元素:8227msArrayList从尾部添加元素:13msLinkedList从尾部添加元素:21ms我们可以看到,从头部开始时添加元素,ArrayList效率低于LinkedList;从中间开始添加元素时,ArrayList的效率要高于LinkedList;从尾部开始添加元素时,ArrayList的效率要高于LinkedList。?这是为什么?”老徐回答:“我给你简单分析一下。”ArrayList是基于数组实现的。向数组头部添加元素时,需要在头部后面添加元素一个一个向后移动,这样效率很低;而LinkedList是基于链表实现的,从头部添加元素时,可以直接通过头部指针添加,效率非常高。ArrayList向数组中间添加元素时,部分元素还需要一个一个地移回,效率不是很高;而LinkedList从中间开始添加元素时,添加元素的效率是最低的,因为靠近中间的位置,在添加元素之前,需要循环遍历一些元素,所以效率很低。ArrayList从尾部开始添加元素时,不需要移动任何元素,直接将元素放入数组中,效率很高。LinkedList虽然不需要循环查找遍历元素,但是LinkedList实例化节点对象和改变指针的过程较多,效率较低。当然,这里有一个大前提,就是ArrayList的初始化容量足够,不需要动态扩充数组容量。因此,在我们日常开发中,最好指定ArrayList的初始化容量。ArrayList和LinkedList删除元素对比首先写一段代码,计算删除元素耗时:/***从List头部删除元素*@paramlistlist*@paramcount删除的个数elements*@returncostTime(unit:ms)*/publicstaticdoubledeleteHeader(Listlist,intcount){for(inti=0;ilist,intcount){for(inti=0;ilist,intcount){for(inti=0;i(count),count)+"ms");System.out.println("从链表头部删除元素:"+deleteHeader(newLinkedList<>(),count)+"ms");System.out.println("从ArrayList中间删除元素:"+deleteMiddle(newArrayList<>(count),count)+"ms");System.out.println("从链表中间删除元素:"+deleteMiddle(newLinkedList<>(),count)+"ms");系统.out.println("从ArrayList尾部删除元素:"+deleteTail(newArrayList<>(count),count)+"ms");System.out.println("删除LinkedList尾部元素:"+deleteTail(newLinkedList<>(),count)+"ms");}运行结果如下:ArrayList头部删除元素:260.7014ms删除链表头部元素:14.2948ms删除ArrayList中间元素:95.9073ms删除链表中间元素:3602.6931ms删除ArrayList尾部元素:1.6261ms删除尾部元素ofLinkedList:3.9645ms我们可以看到,从头部删除元素时,ArrayList的效率低于LinkedList;从中间删除元素时,ArrayList的效率要高于LinkedList;从尾部删除元素时,ArrayList的效率要高于LinkedList。阿珍急忙说道:“删除元素的原理我知道,跟添加元素的原理差不多。”老徐回道:“既然知道了,我就不多说了,我们继续看遍历元素。"ArrayList和LinkedList用两种通用的方法比较遍历元素:for循环和foreach,写一段代码计算这两种遍历方法的耗时:/***通过for循环遍历List**@paramlistlist*@paramcount遍历元素个数*@return耗时(单位:ms)*/publicstaticdoublegetByFor(Listlist,intcount){for(inti=0;ilist,intcount){for(inti=0;i(count),count)+"ms");System.out.println("通过for循环遍历链表:"+getByFor(newLinkedList<>(),count)+"ms");System.out.println("通过foreach遍历ArrayList:"+getByForeach(newArrayList<>(count),count)+"ms");System.out.println("通过foreach遍历LinkedList:"+getByForeach(newLinkedList<>(),count)+"ms");}运行结果如下:通过for循环遍历ArrayList:3.4403ms通过for循环遍历LinkedListfor循环:3563.1219ms通过foreach遍历ArrayList:3.7388ms通过foreach遍历LinkedList:3.7953ms我们可以看到,在遍历for循环时,ArrayList的效率要高于LinkedList,而LinkedList的效率极低;在遍历foreach时,ArrayList的效率和LinkedList相差不大老徐:“阿震,你知道for循环遍历LinkedList的效率为什么这么低吗?”阿震:“因为LinkedList是基于链表实现的,每次for循环都要遍历找到对应的节点,所以严重影响遍历效率;而ArrayList可以直接通过数组下标找到对应的元素,所以for循环效率很高。不是吗?老徐:“对,所以我们不用for循环遍历LinkedList。”总结ArrayList是基于数组实现的,LinkedList是基于链表实现的,当ArrayList初始化容量足够时,从头部添加元素时,ArrayList效率低于LinkedList;从中间添加元素时,ArrayList效率高于LinkedList;从尾部添加元素时,ArrayList效率高于LinkedList;从头部删除元素时,ArrayList效率低于LinkedList;从尾部删除元素时,ArrayList效率低于LinkedList。中间,ArrayList效率高于LinkedList;从尾部删除元素时,ArrayList效率高于LinkedList,遍历for循环时,ArrayList效率高于LinkedList,而LinkedList的效率极低;在遍历foreach时,ArrayList的效率和LinkedList相差不大。最后,谢谢你这么帅,给我点赞和关注。