Java LinkedList<;E>;vs ArrayList<;E>;成本
我在这里读了很多关于在Java中使用ArrayList和LinkedList的成本的问题。到目前为止,我看到的最有用的一个是这里: 我想确定我的理解是正确的 在我当前的用例中,我有多种情况,其中对象存储在列表结构中。每次运行时,列表中对象的数量都会发生变化,因此不需要随机访问列表中的对象。基于此信息,我选择使用LinkedList和ListIterator遍历列表的整个内容 例如,我的代码可能如下所示:Java LinkedList<;E>;vs ArrayList<;E>;成本,java,data-structures,complexity-theory,big-o,Java,Data Structures,Complexity Theory,Big O,我在这里读了很多关于在Java中使用ArrayList和LinkedList的成本的问题。到目前为止,我看到的最有用的一个是这里: 我想确定我的理解是正确的 在我当前的用例中,我有多种情况,其中对象存储在列表结构中。每次运行时,列表中对象的数量都会发生变化,因此不需要随机访问列表中的对象。基于此信息,我选择使用LinkedList和ListIterator遍历列表的整个内容 例如,我的代码可能如下所示: for (Object thisObject : theLinkedList) {
for (Object thisObject : theLinkedList) {
// do something
}
如果这是一个错误的选择,请帮助我理解为什么
我目前的理解是,使用迭代解决方案遍历LinkedList中的整个对象列表将产生O(n)开销。由于不存在对列表的随机访问(例如,需要获取第#3项),因此我目前的理解是,这基本上与在ArrayList的内容上循环并使用索引请求每个元素相同
假设我事先知道要存储在列表中的对象的数量,我当前的思路是,最好将ArrayList初始化为适当的大小,然后完全切换到该结构,而不使用ListIterator。这个逻辑合理吗
一如既往,我非常感谢大家的投入 对
LinkedList
和ArrayList
的迭代应该花费大致相同的时间来完成,因为在每种情况下,从一个元素到下一个元素的步进成本都是恒定的。不过,由于引用的局部性,ArrayList
可能会更好一些,因此可能值得分析一下发生了什么
如果保证始终有固定数量的元素,并且在随机位置不会有插入和删除,那么原始数组可能是一个不错的选择,因为它非常快速,并且针对这种情况进行了很好的优化
也就是说,您对为什么要使用LinkedList
的分析似乎是正确的。同样,对程序进行概要分析并查看ArrayList
对于您的用例来说是否真的更快也没有什么坏处
希望这有帮助