关于Hash冲突

来源:14-4 链地址法 Separate Chaining

慕妹2978617

2020-03-28

老师你好,课程中将的当发生Hash冲突,要在对应的索引位置创建链表,OK,这没问题,但是,相同的hash值对应的对象可能是不用的,但是Key一定是相同的,那么我在用HashMap.get(key),取出的对象是哪个?根据Java中的Hashmap.put,相同的key value会覆盖,这样的话我们取得value是唯一得,那么你在索引位置存链表(存得链表可能存在hash冲突,size>1),是可能有两个值,我已经取得值都是key-value唯一对应了,那么2个问题:
1.你得链表存2个value有什么作用呢?
2. 如果是链表中2个值,我一个key我取得时候该取那个值?
3. 如果用TreeSet是无重复元素得,虽然,key相同 value可能不同,但是恰好我就是put两个key-value一样对象,那么岂不是丢了一个?如果不同得value存到TreeSet中,有回到2,我要怎么取,取谁?

希望我表达清楚我得疑问啦!辛苦老师帮我解答

写回答

2回答

liuyubobobo

2020-03-29

你把 key 和 哈希值的概念搞混了。


产生哈希冲突的,是哈希值,不是 key。是一个哈希值,有可能对应多个数据,但是每个 key,只能对应一个数据。


在哈希表中,对于一个 key,是先计算其哈希值。如果这个哈希值中有个个数据,再去比较,看和 key 对应的数据是谁。


所以:HashMap.get(key) 取出的,就是 key 对应的那个 value。


继续加油!:)

0
0

慕妹2978617

提问者

2020-03-28

我看到课程实现后得我明白我是哪里范糊涂了,HashMap中存得数组存得<K,V>,我以为只存V,如果都存就算2个K是相同得产生冲突,那么里面维护得链表或是Treemap都添加1,因为相同得k就覆盖修改了,同时2个K相同一定会出现冲突

0
0

玩转数据结构

动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…

6221 学习 · 1704 问题

查看课程