使用ArrayList或HashMap可以提高速度

时间:2013-09-18 02:39:18

标签: java performance arraylist hashmap

我需要对象A的'List'或'Map',...这个列表将从另一个ArrayList添加。当A的id参数等于时,对象A被认为等于另一个。

我的问题是我只想添加一个在我的列表中不存在的对象。我想知道两种替代方案之间的实施。使用ArrayList或HashMap

1. ArrayList:

for (A a: source) {if (! (a in ArrayList)) addToArrayList();}

2. HashMap <id, A>

for (A a: source) {hasmap.put (a.id, a)}

这将提供更好的速度来添加大量(超过1000个对象,或更大数量的对象) 我的问题是否有更好的模式???

2 个答案:

答案 0 :(得分:49)

ArrayList每次搜索都有O(n)性能,因此对于n次搜索,其性能为O(n ^ 2)。

HashMap每次搜索都有O(1)表现(平均),因此对于n次搜索,其性能将为O(n)。

虽然HashMap最初会变慢并占用更多内存,但对于较大的n值,它会更快。

ArrayList具有O(n)性能的原因是每次插入时都必须检查每个项目,以确保它不在列表中。我们将进行n次插入,因此整个操作都是O(n ^ 2)。

HashMap具有O(1)性能的原因是散列算法对每个键花费相同的时间,然后查找以找到密钥也需要恒定的时间。有时哈希表超出其加载因子并需要重新分配,这就是为什么它在avarage 上是的常量。

最后,为了回答你的问题,我的建议是使用HashMap

答案 1 :(得分:17)

首先,我要说明这些是两个完全不同的数据结构。 A List处理元素的线性表示,以及{ {1}}处理密钥对值。

我的直觉是,您尝试在MapList之间进行选择。

如果您只想输入唯一的元素,或者更简洁一点,如果您只关心唯一值,那么某种Set是您最好的选择 - 可能Set如果您不关心订购。 It provides O(1) time用于基本操作,例如添加,删除,包含和大小。

(有趣的是,HashSetHashSet支持,但提供类似于HashMap的界面。)