我有一个程序可以随时间收集对象。这些对象通常是,但并不总是程序已经收到的对象的重复。唯一对象的数量有时可达数万。随着我的列表增长,需要更多时间来确定对象是否已经出现过。
我目前的方法是将所有内容存储在ArrayList中;使用Collections.sort(al);并使用Collections.binarySearch(al,key)来确定我是否使用了一个对象。每当我遇到一个新对象时,我必须插入并排序。
我想知道是否有更好的方法来做到这一点。包含物往往会减速太快。我正在寻找尽可能接近O(1)的东西。
非常感谢。
这是java。为了理解我所谈论的内容,我基本上需要一种方法来实现这一点:
public boolean objectAlreadyUsed(Object o) {
return \\ Have we seen this object already?
}
答案 0 :(得分:6)
答案 1 :(得分:6)
为什么不使用Set
实施(可能是HashSet
),而不是使用ArrayList
?您将获得constant-time lookup,无需排序。
N.B。您的对象需要correctly override hashCode()
and equals()
。
答案 2 :(得分:3)
确保对象具有正确的equals()
和hashCode()
方法,并将其存储在HashSet
中。然后查找变为恒定时间。
顺便提一下,如果保留不需要的对象成为问题,您可以考虑使用Internet上可用的许多WeakHashSet
实现之一 - 它将保留对象但仍允许在必要时对其进行垃圾回收