当前位置: 首页 > 面试题库 >

在Java中ArrayList和LinkedList有什么区别?

慕容文昌
2023-03-14
问题内容

在Java中ArrayList和LinkedList有什么区别?何时使用哪一个?


问题答案:

LinkedList并且ArrayListList接口的两种不同的实现。LinkedList用双向链表实现它。ArrayList用动态调整大小的数组实现它。

与标准的链表和数组操作一样,各种方法将具有不同的算法运行时。

对于 LinkedList<E>

  • get(int index)是O(n)(平均n/4步)
  • add(E element)是O(1)
  • add(int index, E element)是O(n)(平均为n/4步),但是当(index = 0 —LinkedList
  • remove(int index)是O(n)(平均n / 4步)
  • Iterator.remove()是O(1)。<—的主要好处LinkedList
  • ListIterator.add(E element)是O(1) 这是…的主要好处之一LinkedList<E>

注意:许多操作平均需要n/4步,在最佳情况下(例如,索引=0)需要恒定的步数,在最坏情况下(列表的中间)需要n/2步

对于 ArrayList<E>

  • get(int index)是O(1) <-ArrayList<E>
  • add(E element)被分摊为O(1),但最差情况为O(n),因为必须调整数组大小并复制它
  • add(int index, E element)是O(n)(平均有n/2步)
  • remove(int index)是O(n)(平均有n/2步)
  • Iterator.remove()是O(n)(平均有n/2步)
  • ListIterator.add(E element)是O(n)(平均有n/2步)
    注意:许多操作平均需要n/2步,在最佳情况下(列表结束)需要恒定的步数,在最坏情况下(列表开始)需要n步

LinkedList<E>允许使用迭代器进行固定时间的插入或删除,但只能顺序访问元素。换句话说,你可以向前或向后浏览列表,但是在列表中查找位置所花费的时间与列表的大小成正比。Javadoc说:“索引到列表中的操作将从开头或结尾遍历列表,以较近者为准”,因此,这些方法的平均值为O(n)(n/4步),尽管O(1)为index = 0。

ArrayList<E>另一方面,允许快速随机读取访问,因此你可以在固定时间内抓取任何元素。但是,从末端开始的任何地方添加或删除,都需要将后面的所有元素移开,以形成开口或填补空白。同样,如果添加的元素多于基础数组的容量,则会分配一个新数组(大小的1.5倍),并将旧数组复制到新数组中,因此在最差的情况下将a添加ArrayList为O(n)情况,但平均保持不变。

因此,根据你打算执行的操作,你应该相应地选择实现。遍历任何一种List实际上都是很便宜的。(从ArrayList技术上讲,迭代速度更快,但是除非你执行的操作确实对性能敏感,否则你不必为此担心-它们都是常量。)

LinkedList当你重复使用现有迭代器来插入和删除元素时,使用generic 的主要好处。然后可以通过仅在本地更改列表在O(1)中完成这些操作。在阵列列表中,阵列的其余部分需要移动(即复制)。另一方面,在最坏的情况下LinkedList以O(n)(n/2步)的链接寻找均值,而在ArrayList所需位置可以数学计算并在O(1)中访问。

使用的另一个好处LinkedList出现当你从列表的头部添加或删除,因为这些操作是O(1) ,而他们是为O(n)进行ArrayList。请注意,这ArrayDeque可能是LinkedList添加和删​​除头部的不错选择,但不是List。

另外,如果列表很大,请记住,内存使用情况也有所不同。a的每个元素LinkedList都有更多的开销,因为还存储了指向下一个和上一个元素的指针。ArrayLists没有这个开销。但是,ArrayLists无论是否实际添加了元素,占用的内存都应为该容量分配的内存。

的默认初始容量ArrayList很小(Java 1.4-1.8中为10)。但是由于底层实现是一个数组,因此如果添加很多元素,则必须调整数组的大小。为了避免在确定要添加很多元素时调整大小的高成本,请ArrayList以较高的初始容量构造。



 类似资料:
  • 本文向大家介绍浅析 ArrayList 和 LinkedList 有什么区别,包括了浅析 ArrayList 和 LinkedList 有什么区别的使用技巧和注意事项,需要的朋友参考一下 ArrayList 和 LinkedList 有什么区别,是面试官非常喜欢问的一个问题。可能大部分小伙伴和我一样,能回答出“ArrayList 是基于数组实现的,LinkedList 是基于双向链表实现的。” 关

  • 本文向大家介绍区分Java中的ArrayList和LinkedList,包括了区分Java中的ArrayList和LinkedList的使用技巧和注意事项,需要的朋友参考一下 一:ArrayList和LinkedList的大致区别如下: 1.ArrayList是实现了基于动态数组的数据结构,ArrayList实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高 2.Li

  • 在Java的LinkedList实现中,我看到两个方法在我看来具有相同的功能。 < code>getFirst() -返回列表中的第一个元素。 --检索但不删除此列表的第一个元素,如果此列表为空,则返回null。 这两个元素都会获得指向LinkedList中First元素的指针,而不会对其进行任何更改。那么,有什么区别? 我看到的唯一区别是,如果列表为空,则< code>peekFirst返回<

  • 本文向大家介绍java中ArrayList和LinkedList的区别详解,包括了java中ArrayList和LinkedList的区别详解的使用技巧和注意事项,需要的朋友参考一下 ArrayList和LinkedList都实现了List接口,有以下的不同点: 1、ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。与此对应,LinkedList

  • 主要内容:1 ArrayList和LinkedList的区别,2 Java ArrayList和LinkedList的例子1 ArrayList和LinkedList的区别 ArrayList和LinkedList都实现List接口并维护插入顺序。两者都是非同步(线程不安全)类。 下面列出了ArrayList和LinkedList类之间的区别。 ArrayList LinkedList ArrayList在内部使用动态数组存储元素。 LinkedList在内部使用双向链表来存储元素。 使用Arr

  • 问题内容: 两种数据结构ArrayList和Vector之间有什么区别,应在哪里使用它们? 问题答案: 我最喜欢动态查询的条件查询。例如,根据某些参数动态地添加一些订购或省去一些零件(例如限制)要容易得多。 另一方面,我将HQL用于静态和复杂查询,因为它更易于理解/阅读HQL。另外,我认为HQL功能更强大,例如对于不同的联接类型。差异性 向量是同步的,而不是ArrayList。 数据增长方法 如果