记住处理哪些对象的最有效方法是什么?
显然可以使用哈希集:
Set<Foo> alreadyProcessed = new HashSet<>();
void process(Foo foo) {
if (!alreadyProcessed.contains(foo)) {
// Do something
alreadyProcessed.add(foo);
}
}
这让我想知道为什么我会存储该对象,而我只想检查该集合中是否存在哈希。假设foo的任何散列都是唯一的。
还有更高效的方法吗?
请记住,将处理大量对象,并且实际的流程代码并不总是很重。此外,我不可能拥有预编译的对象工作清单,它将在处理过程中动态构建。
答案 0 :(得分:2)
您不能使用哈希码,因为两个对象的哈希码相等并不意味着对象是相等的。
否则,根据您想要记住的用例,如果您已经处理了
Object.equals(Object)
对于b),您可以使用标准Set
实施。
对于a)你也可以使用标准Set
实现,如果你现在equals-method返回引用相等,或者你需要类似IdentityHashSet的东西。
在这个答案中没有提到表现,你需要先解决正确性问题!
答案 1 :(得分:2)
Set#contains
可以非常快。这取决于您的hashcode()
和equals()
方法的实施方式。尝试缓存哈希码值以使其更快。 (如String.java)
另一个简单和紧凑的选项是在你的Foo类中添加一个布尔成员:foo.done = true;