在java的底层存储结构中,只有两种,一是数组,二是对象
什么是hash碰撞:当我们把元素存到数组中,他会经过一个计算hash值的算法得到hash值从而分配它的存储位置,这时就不可避免的产生当两个hash值一样的情况,那这个时候怎么储存呢
1:类似于旧版本吧的hashmap,比如两个对象A,B经过计算得到的hash值分配值存储空间都为1号,那么此时就在1号上建立一个类似链表的结构,在A元素的属性种加入一个新的属性用于存放B元素的地址,这和早期的hashmap结构类似,后面的hasp的数据结构将数组改成了红黑树,用来解决链表过长的问题
2:开放地址法:当A和B经过计算后分配到同一个位置,则B去其他空闲的地方。
3:reHash方法:当A和B经过计算后分配到同一个位置,对B进行重新Hash计算,当然,这里的算法和之前的肯定不一样,如果一样那就没意义了。
4:开放公共溢出区:它将底层的数组的存储结构分为寄出去和公共区,对象进来先放到基础区,如果冲突的则放到公共区,如果公共区也冲突的,那我们再想别的办法。
在Java的存储结构中,哈希碰撞是一个重要问题。当两个元素的哈希值相同,导致它们要存放在同一数组位置时,有多种处理策略:1)早期HashMap使用链表,如A、B对象冲突,则A存储并包含B的引用;2)开放地址法,冲突的元素寻找下一个空位;3)再哈希,使用不同的哈希算法避免冲突;4)公开公共溢出区,基础区冲突的对象移到公共区,公共区再冲突需另寻他法。
4068

被折叠的 条评论
为什么被折叠?



