为啥 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>
Deque
与List
具有大部分相同的方法。主要区别在于List
具有通过索引位置访问元素的方法,而Deque
具有访问第一个/最后一个元素的方法。
如果您想使用类似列表的集合结构,其中对最后一个元素的访问很简单,请将代码写入Deque
接口,而不是List
接口,并使用ArrayDeque
而不是ArrayList
。
【讨论】:
非常感谢您的解释安德烈亚斯,这实际上是我正在寻找的答案类型,因为我无法理解这个决定。我不知道 ArrayDeque 的类型,但我相信它非常有趣并且会进一步探索它。非常感谢您的解释。 @ReubemsDeque
是 Java 集合框架中一个被严重忽视的成员。大多数人只使用List
,因为List
足够满足他们的需求,而Deque
会是更好的选择。我也对此感到内疚,但至少我知道它的存在,并且我已经使用它,只是没有像我应该使用的那样频繁。以上是关于为啥 Java 不为 ArrayLists 实现 last() 方法? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
java 使用hasNext()方法的ArrayLists和比较
具有 ArrayLists 和 Pairs 的 Java 优先级队列
java - 如何在java中使用布尔值对ArrayLists进行排序?