Java中ArrayList与LinkList比较

简介

       简单对Java中ArrayList和LinkList进行比较,本文没有代码,纯粹通过自己的学习纯理论地记录下自己对这两个我们在java常用的List的理解进行总结

首先看着两者的数据结构图示:

Java中ArrayList与LinkList比较_第1张图片

比较详细的比较认识:增删改查效率比较
增:

       ArrayList为数组结构,数组长度是固定的,在添加的数据长度未超过当前数组的长度是,它的效率是非常高的,但当要增加数据的index超过数组长度时,ArrayList内部就需要新建一个长度更长的数组并复制原来数组的数据给新数组,这些步骤操作下来它的效率就变的很低了。

       LinkList凭借其双向循环链表结构,可以随时扩展链表长度,添加数据也非常简单,只需要将原尾部节点指向新增数据节点,并更新尾部节点指向和头部节点指向就行,因此综合比较,LinkList在增加数据时效率要优于ArrayList

删:

ArrayList删除数据:删除前边的数据效率低,删除后面的数据效率高

       删除前边的数据,其后面的数据需要通过循环设置的方式将数据依次移到前面,这样就非常影响效率,而删除尾部的数据时,只需将尾部数据清除就行,不会影响前面的数据。
       可以想象排队的方式,排队时前面走了一人,则后面的人要依次向前挪动,而队尾走掉一人,前面的人无需理会。
       由此我们可以在对ArrayList进行元素循环删除操作的时候,可以从尾部开始循环删除,从而提高删除效率。

LinkList删除数据:删除前面和后面的效率高,越往中间走效率越低

       同样的,LinkList凭借其双向循环链表结构,在链表头部或尾部删除数据时,直接改变其Node尾部或头部的指向就行,但是越往中间,就也要通过循环的方式找到目标Node,然后再改变其Node指向,越往中间,循环查找的次数就越多,也就影响了效率

       因此综合比较,LinkList删除数据的效率要略优于ArrayList

改查:

      改和查其实差不多,都要先找到目标元素,之后,改是设置数据,查是获取数据,代码量是一样的
       LinkList改查:每改或查一个元素都需要通过循环的方式找到对应的Node,然后对相应的数据进行改或查
       ArrayList改查:只需要通过它的数组索引(index)即可立刻获取从而进行修改或者查询,所以在这方面ArrayList的效率远高于LinkList

综合比较结论:LinkList在增、删数据效率方面要优于ArrayList,而ArrayList在改和查方面效率要远超LinkList

       还要说的是,虽然综合比较之下LinkList的优势要比ArrayList要好,但是在java中,我们用的比较多的确实ArrayList,因为我们的业务通常是对数据的改和查用的比较多

========================================================================
       最后,知道他们的基本原理后,我们可以自己实现下ArrayList和LinkList,我比较懒,不想写,推荐下我同学写的两篇自己实现的ArrayList和LinkList的文章:
自己写一个简单的ArrayList
自己写一个简单的LinkedList

你可能感兴趣的:(Java基础)