java HashMap碰撞

San*_*mar 29 java hashmap

我正在阅读有关hashmap如何工作的内容.我正在阅读 "如果两个不同的对象具有相同的哈希码将会发生什么".

根据它,如果两个对象具有相同的哈希码,两者都将被存储,LinkedList但据我所知,如果两个哈希码然后前一个将被覆盖新的哈希码(如果我错了,请纠正我).

有人可以更多地了解hashmap如何在内部使用对象作为键,如果两个对象具有相同的哈希码以及如何使用两个对象获取将会发生什么get()

Den*_*ret 39

不,第一个没有被覆盖只是因为第二个具有相同的hashCode.

只有当它也相等时(如所述equals),它才会被覆盖.如果不是,则两个值都将保留在链接列表中.

在获取密钥时,所有具有相同的节点hashCode将与提供的密钥进行比较,直到其中一个相等,然后将返回其值(使用该equals方法).

如果地图中的任何键都不相同,那么你就会得到null.

如果许多对象具有相同的hashCode(或者更准确地说是与内部大小相同的hashCode Entry[] table),那么唯一的问题是链接列表将始终被读取,这会更慢(并且会破坏任何哈希表的目的).这就是设计hashcode方法以确保生成的整数分布均匀的重要原因.

  • [证明](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/HashMap.java)?它散布在互联网上,因为哈希表和哈希映射设计非常陈旧和标准.我们中的许多人早在Java诞生之前就已经使用过或编码过哈希映射. (4认同)
  • 你有什么证据或者例子吗?互联网上充斥着诸如“它创建了一个链接列表”之类的说法,但规范根本没有表明这一点。它如何创建链表?“get”方法应该返回单个对象。 (2认同)

Rai*_*lam 6

让我解释一下hashmap的工作原理.

put方法的工作:

HashMap的 工作在哈希的原则,我们已经put()get()用于存储和检索对象的形式HashMap的方法.当我们将一个键和值传递给put()方法来存储在HashMap上时,它使用密钥对象hashcode()方法来计算哈希码,并且通过对该哈希码应用哈希来识别用于存储值对象的桶位置.检索它时使用键对象等于方法来找出与该键关联的正确键值对和返回值对象.HashMap在发生冲突时使用链表,对象将存储在链表的下一个节点中.HashMap还将key + value元组存储在链表的每个节点中

get方法的工作:

当我们将Key和Value对象传递给put()Java HashMap 上的方法时,HashMap实现调用Key对象上的hashCode方法并将返回的hashcode应用到自己的散列函数中以查找存储Entry对象的存储区位置,重要的一点是Java存储中的HashMap存储密钥和值对象都是存储桶中的Map.Entry.如果在存储桶中找到多个Entry对象,它将调用同一存储桶中每个节点的ke.equals方法.