为啥 Java 不为 ArrayLists 实现 last() 方法? [关闭]

Posted

技术标签:

【中文标题】为啥 Java 不为 ArrayLists 实现 last() 方法? [关闭]【英文标题】:Why does Java not implement a last() method for ArrayLists? [closed]为什么 Java 不为 ArrayLists 实现 last() 方法? [关闭] 【发布时间】:2020-01-04 10:44:50 【问题描述】:

我不是在问如何找到它,这已经在this 其他问题中得到了回答:

但只是深入研究 Java 中的数据结构,我发现 LinkedList 实现有一个 getLast() 方法,但在 ArrayList 实现中没有实现(我想是出于某种原因)。我找不到任何其他类似的问题,也没有在互联网上发布解释它,所以我决定在这里问。

我们可能同意当前从 ArrayList 获取最后一个元素的方式并不优雅,而且通常这种实现比 LinkedList 使用更广泛,因为它在更广泛的场景中表现更好,正如 here 所讨论的那样。

有人知道为什么 ArrayList 没有实现那个方法吗?

编辑:我已经编辑了我的问题以避免混淆和基于意见的答案。根据事实和参考资料,安德烈亚斯的以下答案是我一直在寻找的答案。

【问题讨论】:

这个问题你应该问设计List 界面的人。 当在 Java 8 中引入新的日期和时间 API 时,该接口不能像他们为向后兼容日期和日历类型所做的那样扩展吗?我的意思是他们为相互转换添加的 .from(...) 方法。我相信这样做不会那么复杂,并且不相信我是第一个想知道它的人.. 欢迎您打开JEP。 如果你想使用ArrayList,你可以随时编写自己的类,扩展ArrayList并编写getLast()方法。然后在您的代码中重用该类!问题解决了 请注意,创建辅助方法至少很简单:softsmithy.org/softsmithy-lib/lib/2.0/docs/site/apidocs/org/… 【参考方案1】:

您可以使用简单的ArrayListName.get(ArrayListName.size() - 1); 访问ArrayList 最后一个元素,因为您可以使用其索引直接访问ArrayList 元素,但是在linked list 中,您必须先遍历每个元素才能访问要访问最后一个元素,这[很可能] 工程师创建了一种方法来访问linked list 的最后一个元素。

【讨论】:

根本不是这个原因。 LinkedList 实现 getLast() 方法的原因是它必须实现,因为它实现了 Deque 接口,而 ArrayList 没有。 LinkedList 不实现任何未由接口声明的公共方法。【参考方案2】:

Collection 类通常不实现任何未由接口指定的公共方法。

ArrayList 确实有一个名为 trimToSize() 的方法,它不是由接口指定的,但这是一个非常特定于实现的方法。

LinkedList 没有任何非接口指定的方法。

原因LinkedList 有一个getLast() 显示在 javadoc 中:

指定者:getLast 在接口 DequeE>

DequeList 具有大部分相同的方法。主要区别在于List 具有通过索引位置访问元素的方法,而Deque 具有访问第一个/最后一个元素的方法。

如果您想使用类似列表的集合结构,其中对最后一个元素的访问很简单,请将代码写入Deque 接口,而不是List 接口,并使用ArrayDeque 而不是ArrayList

【讨论】:

非常感谢您的解释安德烈亚斯,这实际上是我正在寻找的答案类型,因为我无法理解这个决定。我不知道 ArrayDeque 的类型,但我相信它非常有趣并且会进一步探索它。非常感谢您的解释。 @Reubems Deque 是 Java 集合框架中一个被严重忽视的成员。大多数人只使用List,因为List 足够满足他们的需求,而Deque 会是更好的选择。我也对此感到内疚,但至少我知道它的存在,并且我已经使用它,只是没有像我应该使用的那样频繁。

以上是关于为啥 Java 不为 ArrayLists 实现 last() 方法? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

java Arraylists.java

java 使用hasNext()方法的ArrayLists和比较

具有 ArrayLists 和 Pairs 的 Java 优先级队列

java - 如何在java中使用布尔值对ArrayLists进行排序?

Java Swing 显示来自 ArrayLists 的大量数据

将 ArrayLists 实现到表模型