我从A
课程返回一个列表。我想从列表中删除第一个元素,并将其作为最后一个元素添加到同一列表中。我是这样做的。
myList.add(myList.get(0));
myList.remove(0);
目标硬件是Android OS。我是否应该以返回A
或ArrayList
的方式对我的LinkedList
课进行编码?哪种情况对以下情况更好:
myList始终有100个元素
myList总是有10个元素
也许我发现没有问题的地方。你觉得在这种情况下我不应该关心性能吗,因为问题的大小(对于1和2都很小)?
我知道这句话"过早的优化是所有邪恶的根源"。这就是为什么我在改变我的实现之前犹豫不决(现在,我的A
对象返回一个ArrayList)。
答案 0 :(得分:10)
简短回答如果您经常添加/删除/更新元素,则应选择LinkedList
,尤其是对于第一个/最后一个元素的情况,因为它包含指向第一个元素的指针和最后一个节点
长答案 LinkedList
add方法提供O(1)
性能,而ArrayList在最坏的情况下提供O(n)
。
LinkedList
更快。它只会引用节点,所以第一个节点消失:
此外,ArrayList
适用于一次性写入多次读取或追加者,但在前面或中间添加/删除时效果不佳。
例如,从链接列表中删除元素需花费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