【问题标题】:LinkedList vs ArrayList on a specific android example [duplicate]特定android示例上的LinkedList vs ArrayList [重复]
【发布时间】:2016-04-02 02:47:49
【问题描述】:

我从A 班级返回一个列表。我想从列表中删除第一个元素并将其作为最后一个元素添加到同一个列表中。我是这样做的。

myList.add(myList.get(0));
myList.remove(0);

目标硬件是 Android 操作系统。我应该以返回ArrayListLinkedList 的方式对A 类进行编码吗?对于以下情况,哪个会更好:

  1. myList 总是有 100 个元素

  2. myList 总是有 10 个元素

也许我看到了一个没有问题的地方。您认为在这种情况下我不应该关心性能,因为问题规模(对于 1 和 2)都很小?

我知道“过早的优化是万恶之源”的说法。这就是为什么我在更改我的实现之前犹豫不决(就目前而言,我的A 对象返回一个 ArrayList)。

【问题讨论】:

  • 如果您经常添加/删除/更新元素,请使用LinkedList
  • premature optimisation is the root of all evil 的座右铭是废话
  • 如果您只添加和删除第一个和最后一个元素,LinkedList 非常适合,因为它包含指向第一个和最后一个节点的指针。
  • @Fantômas 选择正确的集合不是过早的优化,它只是一个好的编程(选择错误的集合是非常糟糕的编程)。过早的优化通常会降低代码的可读性,以换取假设的和未经测试的理论速度提升,甚至可能不需要它。
  • @BillK 我确实喜欢过早的优化。所以,我的观点和你的观点。两所不同的学校。

标签: java android performance arraylist linked-list


【解决方案1】:

简短回答如果您经常添加/删除/更新元素,则应该选择LinkedList,尤其是对于第一个/最后一个元素的情况,因为它包含指向第一个和最后一个的指针节点

长答案 LinkedList add 方法提供 O(1) 性能,而 ArrayList 在最坏的情况下提供 O(n)LinkedList 更快。它只会引用节点,所以第一个会消失:


此外,ArrayList 适用于 write-once-read-many 或 appenders,但不适合从前面或中间添加/删除。

例如,从链表中删除一个元素会花费O(1),而对数组(数组列表)执行此操作会花费O(n)

但是,这并不总是一个规则,正如bigoh 帖子所述:

Big-oh 符号可以为大量数据的性能提供非常好的想法,但唯一真正确定的方法是实际尝试使用大型数据集。大哦符号可能没有考虑到性能问题,例如,随着虚拟内存使用量的增长对分页的影响。尽管基准测试更好,但在设计过程中并不可行,因此选择 Big-Oh 复杂性分析。

以上内容已通过this 帖子进行验证,其中LinkedList 也被证明很慢。

最后,为了进一步/未来的参考,请看一下它们的用例比较,根据javaconceptoftheday.com:

参考文献
http://docs.oracle.com/javase/8/docs/api/java/util/LinkedList.html http://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html

【讨论】:

  • 好答案,但副本涵盖了所有这些
  • 不过,这是一个很好的答案。
猜你喜欢
  • 2021-12-19
  • 2014-09-17
  • 1970-01-01
  • 2016-03-17
  • 2011-01-25
  • 2012-03-24
  • 2017-10-20
  • 1970-01-01
  • 2016-03-16
相关资源
最近更新 更多