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

何时在Java中通过ArrayList使用LinkedList?

禄俊逸
2023-03-14
问题内容

我一直是一个简单使用的人:

List<String> names = new ArrayList<>();

我将接口用作可移植性的类型名称,这样当我问诸如此类的问题时,便可以重新编写代码。

什么时候应该LinkedList使用过ArrayList,反之亦然?


问题答案:

摘要 ArrayListArrayDeque在最好许多更多使用情况比LinkedList。如果不确定,请从开始ArrayList

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

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

对于 LinkedList<E>

get(int index)是O(n)(平均为n/4步),但是当或时为O(1)(在这种情况下,您也可以使用和)。的主要好处之一index = 0index = list.size() - 1getFirst()getLast() LinkedList<E>add(int index, E element)是O(n)(平均n / 4步),但是当或时为O(1)(在这种情况下,您也可以使用和/)。的主要好处之一index = 0index = list.size() - 1addFirst()addLast()add() LinkedList<E>remove(int index)是O(n)(平均为n/4步),但是当或时为O(1)(在这种情况下,您也可以使用和)。的主要好处之一index = 0index = list.size() - 1removeFirst()removeLast() LinkedList<E>
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它会给我输入图像描述时的错误herstrong texte善意的帮助

  • 我在java中使用Arraylists时遇到了问题,我的代码如下所示: 我将相同的数字添加到列表中,但是当我试图像这样比较列表中索引0的数字时,布尔值的结果是false,而它应该是true: 为false 但是当我使用一些临时变量,然后比较它们时,它给出了我所期望的,在bcompare上的真实值: 为true 我在这里做错了什么?

  • 我在使用JNA的java中使用dll,但我得到以下错误 线程“main”java中出现异常。lang.UnsatifiedLinkError:查找函数“GetStatus”时出错:找不到指定的过程。 不知道如何解决此问题? 请帮忙。 这是java代码

  • 问题内容: 基于此问题 递增变量名称? 我有一个数组列表“ peopleHolder”,其中包含各种“人”对象。我想基于for循环自动创建“人”对象。我做了以下 我想从人员类中调用方法。例如person.setAge; 如何通过arraylist调用此类方法?我想为每个对象设置值的方法。 问题答案: 如果要在列表中的所有对象上调用某种方法,则需要首先对其进行迭代,然后在每个元素中调用方法。可以说您

  • 问题内容: 我需要使用JavaScript中jar文件中的类。我正在通过Java ScriptEngine使用JavaScript,并且想做一些与Jython相似的事情, 当我使用Jython执行此操作时,它工作正常,并且python文件可以使用jar文件中的api类。 问题答案: 我可以以此方式在JavaScript中使用jar的类,但是在运行时必须将jar设置为类路径。我正在寻求类似于Jyth

  • 问题内容: 这是来自 HeadFirst Java的 :(第575页) 这个: 做与此相同的事情: 所以这是我的问题:如果它们完全相同,我们为什么不写 要么 另外,什么时候使用?是有用的?而不是使用泛型的方法声明(如上所述)中的T或用于类声明?有什么好处? 问题答案: 之间的最大区别 和 是在前一种方法中,您可以在方法中将“ T”作为给出的具体类。在第二种方法中,您无法执行此操作。 这里有一个更复