特定android示例上的LinkedList vs ArrayList [重复]
Posted
技术标签:
【中文标题】特定android示例上的LinkedList vs ArrayList [重复]【英文标题】:LinkedList vs ArrayList on a specific android example [duplicate] 【发布时间】:2016-04-02 02:47:49 【问题描述】:我从A
班级返回一个列表。我想从列表中删除第一个元素并将其作为最后一个元素添加到同一个列表中。我是这样做的。
myList.add(myList.get(0));
myList.remove(0);
目标硬件是 android 操作系统。我应该以返回ArrayList
或LinkedList
的方式对A
类进行编码吗?对于以下情况,哪个会更好:
myList 总是有 100 个元素
myList 总是有 10 个元素
也许我看到了一个没有问题的地方。您认为在这种情况下我不应该关心性能,因为问题规模(对于 1 和 2)都很小?
我知道“过早的优化是万恶之源”的说法。这就是为什么我在更改我的实现之前犹豫不决(就目前而言,我的A
对象返回一个 ArrayList)。
【问题讨论】:
如果您经常添加/删除/更新元素,请使用LinkedList
。
premature optimisation is the root of all evil
的座右铭是废话。
如果您只添加和删除第一个和最后一个元素,LinkedList 非常适合,因为它包含指向第一个和最后一个节点的指针。
@Fantômas 选择正确的集合不是过早的优化,它只是一个好的编程(选择错误的集合是非常糟糕的编程)。过早的优化通常会降低代码的可读性,以换取假设的和未经测试的理论速度提升,甚至可能不需要它。
@BillK 我确实喜欢过早的优化。所以,我的观点和你的观点。两所不同的学校。
【参考方案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
【讨论】:
好答案,但副本涵盖了所有这些 不过,这是一个很好的答案。以上是关于特定android示例上的LinkedList vs ArrayList [重复]的主要内容,如果未能解决你的问题,请参考以下文章
我想在 Android、java 客户端 v-5.0.4 和 appium v-1.7.1 中使用 appium 向下滚动到特定元素
使用 MediaStore 存储图像会导致特定三星设备上的应用程序崩溃