我有一个问题,在开始时在列表中使用了大量插入,之后搜索和检索操作被广泛使用,那么哪种方法是好的和有效的呢?
方法1:
使用LinkedList
作为整个程序的数据结构。
方法 2:
使用 ArrayList
作为整个程序的数据结构。
方法 3:
在开始时使用 LinkedList
作为我的数据结构进行插入并执行 Arraylist al = new Arraylist(ll);
用于检索操作。
更改数据结构的成本是多少?真的值得这样做吗?
由于它们都实现相同的接口,因此您可以通过编写代码来自己找到这一点,以便可以插入构造函数并以两种方式测试代码。基准测试可以通过 jmh 完成。
可以使用供应商接口插入构造函数。
根据问题的性质,您可能会发现使用 Deque 是合适的。
请允许我建议第四种方法:对整个程序使用 ArrayDeque
。它在前面和后面都有高效的插入(可能比LinkedList
更快(和搜索效率,就像ArrayList
一样。 ArrayDeque
是Java集合框架中一个被不公平地忽视的类,可能是因为它是后来添加的(我认为Java 6(。它不实现List
接口,因此您必须专门为它编写程序。
除此之外,您的问题只有两个有效的答案是
- 在绝对必要之前,不要担心效率。
- 如果您必须担心效率,则必须自行衡量环境中数据的性能令人满意。这里没有人能告诉你。
这取决于插入和检索操作的频率。以下是复杂性:
-
ArrayList
-> 开头插入:O(n( -
ArrayList
-> 基于索引的检索:O(1( -
LinkedList
-> 开头插入:O(1( -
LinkedList
-> 基于索引的检索:O(i(,其中 i 是要扫描的元素数。
因此,如果您的检索次数多于插入次数,请进行ArrayList
,如果没有,请LinkedList