在Java中使用hashcode有什么用?

在Java中, obj.hashcode()返回一些值。 这个哈希码在编程中有什么用处?

hashCode()用于Hash实现中的Hash实现,如HashMapHashTableHashSet等。

hashCode()接收的值被用作存储集合/映射的元素的桶号 。 这个桶号是set / map中元素的地址

当你做了contains()时候,就会得到元素的哈希码,然后查找哈希码所指向的桶。 如果在同一个桶中find多个元素(多个对象可以有相同的散列码),那么它使用equals()方法来评估对象是否相等,然后判断contains()是true还是false,或者决定元素是否可以添加到集合中。

从Javadoc :

返回该对象的哈希码值。 为了散列表(如java.util.Hashtable提供的散列表)的好处,支持此方法。

hashCode的一般合约是:

  • 只要在Java应用程序的执行过程中多次调用同一个对象, hashCode方法必须始终返回相同的整数 ,前提是在对象的equals比较中没有使用的信息被修改。 从应用程序的一次执行到同一应用程序的另一次执行,此整数不必保持一致。

  • 如果两个对象按照equals(Object)方法equals(Object) ,那么在两个对象的每一个上调用hashCode方法必须产生相同的整数结果。

  • 如果两个对象根据equals(java.lang.Object)方法不相等,则不要求对两个对象中的每个对象调用hashCode方法都必须产生不同的整数结果。 但是,程序员应该意识到,为不相等的对象生成不同的整数结果可能会提高哈希表的性能。

尽可能多地合理实用,由类Object定义的hashCode方法确实为不同的对象返回不同的整数。 (这通常通过将对象的内部地址转换为整数来实现,但Java编程语言不需要此实现技术。)

hashcode()是一个接受对象并输出数字值的函数。 如果对象不改变,对象的哈希码总是相同的。

HashMapHashTableHashSet等需要存储对象的函数将使用一个hashcode模数的内部数组大小来select存储对象的“内存位置”(即数组位置)。

在某些情况下,可能会发生冲突(两个对象以相同的哈希码结尾,当然需要仔细解决)。

尽pipe散列码对您的业务逻辑没有任何影响,但在大多数情况下我们必须关心它。 因为当你的对象被放入一个基于散列的容器(HashSet,HashMap …)时,容器会放置/获取元素的散列码。

Hashcode是由JVM为每个对象创build生成的唯一代码。我们使用散列码对散列表,散列表等散列相关的algorithm进行一些操作。散列码的优点是当我们search一个唯一的代码有助于发现这个对象的对象。 但是我们不能说哈希码是obj的地址。 它是由JVM为每个对象生成的唯一代码。这是现在日常哈希algorithmz最stream行的searchalgorithm

hashCode()返回的值是对象的哈希码,它是以hex表示的对象的内存地址。

根据定义,如果两个对象相等,则它们的哈希码也必须相等。 如果重写equals()方法,则可以改变两个对象的等同方式,并且Object的hashCode()实现不再有效。 因此,如果重写equals()方法,则还必须重写hashCode()方法。

这个答案来自java SE 8官方教程文档

给定类的hashCode方法可以用来testing对象的不等式,但不能用于该类的对象相等。

java.util.HashSet集合类使用hashCode方法将该集合中的元素分组为哈希桶以便快速检索。