在Java6中,我的理解是,您可以在创建TreeSet时为它提供一个比较器,以覆盖集合中对象的“自然排序”。
你有没有想过为什么Java不支持提供一个"Hasher“来覆盖集合中对象的”自然散列“?
编辑:从你那里获得输入可能会对我将来设计API有所帮助。
谢谢。
发布于 2010-12-14 23:07:30
以下是几个可能的原因:
发布于 2010-12-14 22:58:59
对于Hasher Object 类中的Object方法,对象是多余的。
如果您希望影响散列的性质,则应该覆盖在Object上定义的hashCode()方法。只需确保覆盖equals(Object),因为这两个应该始终一起使用。
HashSet或其他类似的数据结构将使用对象的hashCode()方法来获得散列值,以确定bin存储。然后,它将使用equals()将该对象与同一绑定中的其他对象进行比较,以确定相等。
生成的哈希码对于该特定的对象类必须是唯一的。这可以通过覆盖hashCode()方法来确保,并且不需要在不同的实现之间进行更改。Hasher对象只会造成混淆,不会有额外的用途。我想不出有哪一个用例需要多个哈希码来存储在不同的数据结构中。
发布于 2010-12-14 22:55:33
确实是这样!查看Object.hashCode方法。
再读一遍你的问题后,我可能已经抢先一步了。我现在看到你说的“超越”自然兴声。通常,我们在对象级别覆盖散列值,并放弃使用覆盖散列器。
哈希应该比比较器更通用。也就是说,哈希应该几乎总是创建统一的不受信任的值,几乎没有冲突的机会。使用它们的容器应该很少需要专门的hasher。
https://stackoverflow.com/questions/4440409
复制相似问题