java hash存储_java – HashTable和HashMap键值如何存储在内存中?

我知道有一种散列技术应用于一个键,用于将其值存储在内存地址中.

但是我不明白碰撞是怎么发生的? Java使用哪种哈希算法来创建内存空间?是MD5吗?

解决方法:

HashMap的基本思想是这样的:

> HashMap实际上是一个包含Key和Value的特殊对象数组.

>阵列有一些桶(槽),比如16.

>哈希算法由每个对象拥有的hashCode()方法提供.因此,在编写新类时,应该注意正确的hashCode()和equals()方法实现.默认值(Object类)将内存指针作为数字.但这对我们想要使用的大多数类都不好.例如,String类使用一种算法,该算法从字符串中的所有字符生成哈希 – 想象如下:hashCode = 1.char 2.char 3.char …(简化).因此,两个相等的字符串,即使它们位于内存中的不同位置,也具有相同的hashCode().

> hashCode()的结果,比如“132”,那么如果我们有一个大的数组,那么应该存储对象的存储桶数量.但我们没有,我们的只有16桶.所以我们使用明显的计算’hashcode%array.length = bucket’或’132 mod 16 = 4’并将Key-Value对存储在4号桶中.

>

>如果还没有其他配对,那没关系.

>如果有一个Key等于我们拥有的Key,我们删除旧的.

>如果还有另一个Key-Value对(碰撞),我们将旧的一对键链接到一个链表.

>如果支持数组变得太满,那么我们必须制作太多链表,我们创建一个双倍长度的新数组,重新散列所有元素并将它们添加到新数组中,然后我们处理旧数组.这很可能是HashMap上最昂贵的操作,所以如果你之前知道它,你想告诉你的地图你将使用多少桶.

>如果有人试图得到一个值,他提供一个密钥,我们哈希,修改它,然后通过潜在的链表进行完全匹配.

在这种情况下,

>有一个256桶的数组(编号当然是0-255)

>有五个人.在通过mod 256之后,它们的哈希码指向阵列中的四个不同的槽.

>你可以看到Sandra Dee没有免费插槽,因此她被约翰史密斯锁定了.

现在,如果您试图查找Sandra Dee的电话号码,您可以将她的名字哈希,将其修改为256,并查看存储桶152.在那里您可以找到John Smith.那不是桑德拉,再往前看……啊哈,桑德拉在约翰之后被束缚住了.

标签:java,hashmap,hashtable

来源: https://codeday.me/bug/20190928/1827141.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值