Java:有效地跟踪使用过的对象

时间:2012-01-06 15:01:16

标签: java search sorting duplicates

我有一个程序可以随时间收集对象。这些对象通常是,但并不总是程序已经收到的对象的重复。唯一对象的数量有时可达数万。随着我的列表增长,需要更多时间来确定对象是否已经出现过。

我目前的方法是将所有内容存储在ArrayList中;使用Collections.sort(al);并使用Collections.binarySearch(al,key)来确定我是否使用了一个对象。每当我遇到一个新对象时,我必须插入并排序。

我想知道是否有更好的方法来做到这一点。包含物往往会减速太快。我正在寻找尽可能接近O(1)的东西。

非常感谢。

这是java。为了理解我所谈论的内容,我基本上需要一种方法来实现这一点:

public boolean objectAlreadyUsed(Object o) {
  return \\ Have we seen this object already?

}

3 个答案:

答案 0 :(得分:6)

这引出了一个问题 - 为什么不使用不允许重复的数据结构(例如Set)?如果您尝试add重复的项目,该方法将返回false,数据结构将保持不变。

答案 1 :(得分:6)

为什么不使用Set实施(可能是HashSet),而不是使用ArrayList?您将获得constant-time lookup,无需排序。

N.B。您的对象需要correctly override hashCode() and equals()

答案 2 :(得分:3)

确保对象具有正确的equals()hashCode()方法,并将其存储在HashSet中。然后查找变为恒定时间。

顺便提一下,如果保留不需要的对象成为问题,您可以考虑使用Internet上可用的许多WeakHashSet实现之一 - 它将保留对象但仍允许在必要时对其进行垃圾回收