Java:记住处理哪些对象的有效方法

时间:2015-09-09 19:05:36

标签: java performance optimization hash hashset

记住处理哪些对象的最有效方法是什么?

显然可以使用哈希集:

Set<Foo> alreadyProcessed = new HashSet<>();

void process(Foo foo) {
    if (!alreadyProcessed.contains(foo)) {
        // Do something
        alreadyProcessed.add(foo);
    }
}

这让我想知道为什么我会存储该对象,而我只想检查该集合中是否存在哈希。假设foo的任何散列都是唯一的。

还有更高效的方法吗?

请记住,将处理大量对象,并且实际的流程代码并不总是很重。此外,我不可能拥有预编译的对象工作清单,它将在处理过程中动态构建。

2 个答案:

答案 0 :(得分:2)

您不能使用哈希码,因为两个对象的哈希码相等并不意味着对象是相等的。

否则,根据您想要记住的用例,如果您已经处理了

  • a)相同的对象,通过引用测试,或
  • b)通过调用Object.equals(Object)
  • 进行测试的同等对象

对于b),您可以使用标准Set实施。

对于a)你也可以使用标准Set实现,如果你现在equals-method返回引用相等,或者你需要类似IdentityHashSet的东西。

在这个答案中没有提到表现,你需要先解决正确性问题!

答案 1 :(得分:2)

  1. Set#contains可以非常快。这取决于您的hashcode()equals()方法的实施方式。尝试缓存哈希码值以使其更快。 (如String.java)

  2. 另一个简单和紧凑的选项是在你的Foo类中添加一个布尔成员:foo.done = true;