快捷搜索:  汽车  科技

arraylist和linked list区别:回答经典面试题ArrayList和LinkedList的区别时

arraylist和linked list区别:回答经典面试题ArrayList和LinkedList的区别时二、ArrayList和LinkedList的区别4、都是非线程安全的。1、ArrayList和LinkedList都是List接口的实现类,有共同的父类AbstractList和AbstractCollection;2、两者其中存储的数据有序,值允许重复;3、可以插入多个null元素;

ArrayList和LinkedList到底有什么联系和区别?

作为一个经典的Java面试题,这个问题在度娘上一搜一大堆。有讲得很到位的,但是大多数都是人云亦云,同一篇文章略改几个字就到处飞。总体来看这些文章没有啥错,但是描述上不够准确。本文也谈ArrayList和LinkedList的区别,但是要对两者区别的误区进行厘清。目的是让每位学员心知肚明,而不要再以讹传讹,人云亦云。

先说两者的联系,光看名字也能知道两者有联系,再看两个类的家谱,就更加清晰。

arraylist和linked list区别:回答经典面试题ArrayList和LinkedList的区别时(1)

arraylist和linked list区别:回答经典面试题ArrayList和LinkedList的区别时(2)

一、ArrayList和LinkedList的共同点

1、ArrayList和LinkedList都是List接口的实现类,有共同的父类AbstractList和AbstractCollection;

2、两者其中存储的数据有序,值允许重复;

3、可以插入多个null元素;

4、都是非线程安全的。

二、ArrayList和LinkedList的区别

如果在网上查询ArrayList和LinkedList的区别,往往给出以下答案:

1、ArrayList:基于数组实现;非线程安全,效率高;增删慢,查找快;

2、LinkedList:基于链表实现;非线程安全;增删快,查找慢。

这个答案看起来简洁清晰,学员很喜欢这样好背的题,于是大家果真就如此背下来。但是如果面试时如此回答,面试官立刻就能知道你不过是在背题,而并非真正理解。

的确,普遍我们都这样认为:ArrarList查询和获取快,修改和删除慢;LinkedList修改和删除快,查询和获取慢。但是请牢记,其实这样的说法是不准确的。

接下来让我们来深入认识ArrayList和LinkedList。

ArrayList和LinkedList的区别,本质就是数组和链表的区别。而数组和链表的区别,这也是面试中的高频问题。

(一)、数组和链表的差异

数组

链表

内存地址

内存空间连续

内存空间不连续

数据长度

长度固定,一般不可以动态扩展

长度可以动态变化

数据访问方式

随机访问

顺序访问

查询效率

效率高。通过数组下标直接访问

效率低。只能通过遍历节点依次查询

增删效率

效率低。需要移动被修改元素之后的所有元素

效率高。只需要修改指针指向

数组是开辟了一块连续内存空间的存储对象。如同一支队伍在操场上排队,大家连续排列成一队。如果把其中的某人拉出来,那么后面的人肯定每个人都要上前一步,重新把队伍排整齐。这就是数组在中间增加和删除元素后,需要移动被修改元素之后所有的元素。

链表则如同聪明的地下党,平时隐藏在城市的各个角落,需要接头时,可以根据自己手里的联系方式,找到其上级或下级。每位成员只能找到其直接的上级或下级,而其他成员的信息他们无从所知。这些成员的联系方式就是链表中的指针信息。

链表的查询效率低,因为要查到某个节点,只能通过遍历节点依次查询;而链表增删效率高,因为删除某个节点后,只需要修改指针指向即可。

(二)、Array和ArrayList的区别

数组Array和ArrayList又是什么关系呢?这两者的联系和区别,也是面试中的一个高频问题。

1、ArrayList是Array的复杂版本。

ArrayList内部封装了一个Object类型的数组,可以说ArrayList对数组进行了一层封装。但是ArrayList是动态数组,是可变大小的复杂数组,它可以动态的添加和删除元素。

2、两者在存储的数据类型上有差异。

我们在定义一个数组的时候,必须指定这个数组的数据类型,也就是说,数组是相同数据类型的集合。Array只能存储相同数据类型的数据。

而ArrayList可以存储异构对象。在不使用泛型的情况下,ArrayList可以添加不同类型的元素,在使用泛型时则只能添加一种类型的数据。

3、两者在长度可变与否上有差异。

在数组声明的时候,我们需要声明数组的大小,数组的元素个数是固定的。也就是说Array的长度是固定的,不可变的。

而ArrayList的长度既可以指定也可以不指定,ArrayList 的容量根据需要自动扩展,ArrayList增加原来空间的50%,它是变长的。如果更改了 ArrayList.Capacity 属性的值,也可以自动进行内存重新分配和元素复制。

4、其他区别:

  • Array 位于 System 命名空间中;ArrayList 位于 System.Collections 命名空间中。
  • Array 可以具有多个维度,而 ArrayList 始终只是一维的。
  • Array可以设置下限,但 ArrayList 的下限始终为零。
  • 在 Array 中,您只能一次获取或设置一个元素的值,而ArrayList 提供添加、插入或移除某一范围元素的方法。
  • 存储非Object的值类型数据,ArrayList的性能不如Array的性能好。因为 ArrayList 的元素属于Object 类型,往ArrayList里面添加或修改值类型元素,都会引起装箱和拆箱的操作,频繁的操作会降低效率。

(三)、ArrayList和LinkedList的区别

1、ArrayList和LinkedList两者性能上的差别

1)、ArrayList基于数组实现,LinkedList基于链表实现;

2)、一般认为基于数组实现,增删慢,查找快;基于链表实现,增删快,查找慢。其实这个说法不够准确。

在指定位置插入新数据时,LinkedList因为是双向链表,新增某个节点后,只需要修改指针指向即可,所以在哪个位置插入新节点,效率都是一样的。

而ArrayList在新插入数据后,要对后续所有元素批量拷贝,也就是要重新调整队伍,所以在数据结构前段和数据结构后段,或者在数据结构末尾,由于涉及的元素在数量越来越少,所以执行效率上是不同的。

在ArrayList的末尾插入新数据,其实只是在指定位置上赋值即可。但是LinkedList则需要创建Node对象,且要建立前后节点的关联 ,当对象越大时,执行效率是降低。

至于删除元素。LinkedList在删除元素后,要重新指向指针,而如果在ArrayList末位删除元素,则仅仅将元素弹出而已。

综上说述,ArrayList增删一定慢于LinkedList吗?答案很清晰了,未必如此,要分情况。

要说明的是,LinkedList整体插入、删除的执行效率比较稳定,没有ArrayList这种越往后越快的情况;此外,插入元素的时候,如果空间不足,ArrayList会进行自动扩容,ArrayList底层数组扩容是一个既消耗时又消耗空间的操作,遇到需要扩容的情况,ArrayList新增元素的执行效率一定是低于LinkedList的。

实际开发中怎么选择是使用ArrayList还是LinkedList呢?

当数据结构需要频繁插入和删除元素,那么选择LinkedList;当数据结构需要频繁查找元素,那么选择ArrayList;如果不确定到底增删多还是查询多,那么建议使用LinkedList。

3)、替换指定位置的元素时,ArrayList比LinkedList更快。

ArrayList:数组[index] = elelement 就可以了,非常的快。

LinkedList:需要先找到inde位置的元素,然后再调整指针的指向。

因此,替换元素时,ArrayList比LinkedList更快。

2、ArrayList和LinkedList在遍历方式的选择上不同

1)、遍历ArrayList推荐使用for循环。

遍历ArrayList可以使用for循环,也可以使用foreach循环。如果使用foreach,当数据量增多时,耗时会有微弱增加。其实两种遍历方式在效率上没有明显差异,只不过数据量越大,遍历ArrayList使用for循环会更快。

但是foreach代码简洁美观,相对于下标循环而言的,foreach不必关心下标初始值和终止值及越界等,所以不易出错。如果考虑foreach的代码优点,遍历ArrayList也可选用foreach。

2)、遍历LinkedList推荐使用foreach循环。

遍历LinkedList推荐使用foreach循环,如果使用for循环,则效率会降低,当数据量越大时,耗时会大幅增加。

猜您喜欢: