我需要对象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个对象,或更大数量的对象) 我的问题是否有更好的模式???
答案 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}}处理密钥对值。
我的直觉是,您尝试在Map
和List
之间进行选择。
如果您只想输入唯一的元素,或者更简洁一点,如果您只关心唯一值,那么某种Set
是您最好的选择 - 可能Set
如果您不关心订购。 It provides O(1) time用于基本操作,例如添加,删除,包含和大小。
(有趣的是,HashSet
由HashSet
支持,但提供类似于HashMap
的界面。)