java – HashTable和HashMap键值如何存储在内存中?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – HashTable和HashMap键值如何存储在内存中?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1659字,纯文字阅读大概需要3分钟。
内容图文
我知道有一种散列技术应用于一个键,用于将其值存储在内存地址中.
但是我不明白碰撞是怎么发生的? 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上最昂贵的操作,所以如果你之前知道它,你想告诉你的地图你将使用多少桶.
>如果有人试图得到一个值,他提供一个密钥,我们哈希,修改它,然后通过潜在的链表进行完全匹配.
An image, courtesy of Wikipedia:
在这种情况下,
>有一个256桶的数组(编号当然是0-255)
>有五个人.在通过mod 256之后,它们的哈希码指向阵列中的四个不同的槽.
>你可以看到Sandra Dee没有免费插槽,因此她被约翰史密斯锁定了.
现在,如果您试图查找Sandra Dee的电话号码,您可以将她的名字哈希,将其修改为256,并查看存储桶152.在那里您可以找到John Smith.那不是桑德拉,再往前看……啊哈,桑德拉在约翰之后被束缚住了.
内容总结
以上是互联网集市为您收集整理的java – HashTable和HashMap键值如何存储在内存中?全部内容,希望文章能够帮你解决java – HashTable和HashMap键值如何存储在内存中?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。