Hash冲突
来源:互联网 发布:交换机端口down 编辑:程序博客网 时间:2024/05/19 07:10
HashMap 采用一种所谓的“Hash 算法”来决定每个元素的存储位置。当程序执行 map.put(String,Obect)方法 时,系统将调用String的 hashCode() 方法得到其 hashCode 值——每个 Java 对象都有 hashCode() 方法,都可通过该方法获得它的 hashCode 值。得到这个对象的 hashCode 值之后,系统会根据该 hashCode 值来决定该元素的存储位置。源码如下:
- public V put(K key, V value) {
- if (key == null)
- return putForNullKey(value);
- int hash = hash(key.hashCode());
- int i = indexFor(hash, table.length);
- for (Entry<K,V> e = table[i]; e != null; e = e.next) {
- Object k;
- //判断当前确定的索引位置是否存在相同hashcode和相同key的元素,如果存在相同的hashcode和相同的key的元素,那么新值覆盖原来的旧值,并返回旧值。
- //如果存在相同的hashcode,那么他们确定的索引位置就相同,这时判断他们的key是否相同,如果不相同,这时就是产生了hash冲突。
- //Hash冲突后,那么HashMap的单个bucket里存储的不是一个 Entry,而是一个 Entry 链。
- //系统只能必须按顺序遍历每个 Entry,直到找到想搜索的 Entry 为止——如果恰好要搜索的 Entry 位于该 Entry 链的最末端(该 Entry 是最早放入该 bucket 中),
- //那系统必须循环到最后才能找到该元素。
- if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
- V oldValue = e.value;
- e.value = value;
- return oldValue;
- }
- }
- modCount++;
- addEntry(hash, key, value, i);
- return null;
- }
上面程序中用到了一个重要的内部接口:Map.Entry,每个 Map.Entry 其实就是一个 key-value 对。从上面程序中可以看出:当系统决定存储 HashMap 中的 key-value 对时,完全没有考虑 Entry 中的 value,仅仅只是根据 key 来计算并决定每个 Entry 的存储位置。这也说明了前面的结论:我们完全可以把 Map 集合中的 value 当成 key 的附属,当系统决定了 key 的存储位置之后,value 随之保存在那里即可.HashMap程序经过我改造,我故意的构造出了hash冲突现象,因为HashMap的初始大小16,但是我在hashmap里面放了超过16个元素,并且我屏蔽了它的resize()方法。不让它去扩容。这时HashMap的底层数组Entry[] table结构如下:
Hashmap里面的bucket出现了单链表的形式,散列表要解决的一个问题就是散列值的冲突问题,通常是两种方法:链表法和开放地址法。链表法就是将相同hash值的对象组织成一个链表放在hash值对应的槽位;开放地址法是通过一个探测算法,当某个槽位已经被占据的情况下继续查找下一个可以使用的槽位。java.util.HashMap采用的链表法的方式,链表是单向链表。形成单链表的核心代码如下:
- HASH冲突
- hash冲突
- Hash冲突
- Hash冲突
- Hash冲突
- Hash表、Hash冲突
- Hash表和Hash冲突
- hash冲突处理
- hash表冲突解决方法
- 解决hash冲突
- hash冲突解决
- 哈希(hash)表冲突
- Hash冲突解决办法
- Hash的冲突解决方案
- hash冲突处理
- hash冲突的解决方法
- hash 冲突处理
- Hash冲突解决方法
- 哈尔滨理工大学新生赛
- 服务器、计算机、工作站三者的区别
- 电能质量分析仪安装(access数据库版本 /WIN10系统) 出现
- 基于spring-boot的文件上传和下载(包括图片的压缩)--第一篇(Java代码)
- 使用Tesseract-ocr识别验证码,暴力破解某高校学生登录系统
- Hash冲突
- React Native下载打开pdf文件
- networkx学习
- 门电路加法
- 百度2017春招笔试真题编程题集合:不等式数列 [python]
- Hive文件数创建过多的问题
- 百度2017春招笔试真题编程题集合:买帽子 [python]
- PHP学习笔记 01
- 百度2017春招笔试真题编程题集合:寻找三角形 [python]