首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我们可以为TreeSet提供比较器,而不能为HashSet提供类似Hasher的比较器?

为什么我们可以为TreeSet提供比较器,而不能为HashSet提供类似Hasher的比较器?
EN

Stack Overflow用户
提问于 2010-12-14 22:52:25
回答 5查看 661关注 0票数 2

在Java6中,我的理解是,您可以在创建TreeSet时为它提供一个比较器,以覆盖集合中对象的“自然排序”。

你有没有想过为什么Java不支持提供一个"Hasher“来覆盖集合中对象的”自然散列“?

编辑:从你那里获得输入可能会对我将来设计API有所帮助。

谢谢。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-12-14 23:07:30

以下是几个可能的原因:

  • Simplicity -大多数人不需要多个散列函数,所以为了保持approach
  • Performance简单,依赖单个Object.hashCode()散列函数是有意义的-至少在标准库中,HashSets和HashMaps等需要进行大量优化,因为它们被广泛使用。调用单独的“散列器”的开销是没有意义的,无论这种开销多么小,be.
  • Private字段-存在hashCode()可能依赖于私有字段的问题,它可能很难为某些对象创建外部“散列器”。
票数 2
EN

Stack Overflow用户

发布于 2010-12-14 22:58:59

对于Hasher Object 类中的Object方法,对象是多余的。

如果您希望影响散列的性质,则应该覆盖在Object上定义的hashCode()方法。只需确保覆盖equals(Object),因为这两个应该始终一起使用。

HashSet或其他类似的数据结构将使用对象的hashCode()方法来获得散列值,以确定bin存储。然后,它将使用equals()将该对象与同一绑定中的其他对象进行比较,以确定相等。

生成的哈希码对于该特定的对象类必须是唯一的。这可以通过覆盖hashCode()方法来确保,并且不需要在不同的实现之间进行更改。Hasher对象只会造成混淆,不会有额外的用途。我想不出有哪一个用例需要多个哈希码来存储在不同的数据结构中。

票数 2
EN

Stack Overflow用户

发布于 2010-12-14 22:55:33

确实是这样!查看Object.hashCode方法。

再读一遍你的问题后,我可能已经抢先一步了。我现在看到你说的“超越”自然兴声。通常,我们在对象级别覆盖散列值,并放弃使用覆盖散列器。

哈希应该比比较器更通用。也就是说,哈希应该几乎总是创建统一的不受信任的值,几乎没有冲突的机会。使用它们的容器应该很少需要专门的hasher。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4440409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档