在Java中使用hashcode有什么用?
在Java中, obj.hashcode()
返回一些值。 这个哈希码在编程中有什么用处?
hashCode()
用于Hash
实现中的Hash
实现,如HashMap
, HashTable
, HashSet
等。
从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()
是一个接受对象并输出数字值的函数。 如果对象不改变,对象的哈希码总是相同的。
像HashMap
, HashTable
, HashSet
等需要存储对象的函数将使用一个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方法将该集合中的元素分组为哈希桶以便快速检索。