其实就是四种方法的演变

1.开放定址法

具体就是把数据的标志等的对长度取模

有三种不同的取模

线性探测再散列 给数据的标志加增量,取模

平方探测再散列 给数据的标志平方,取模

随机探测再散列 把数据的标志随机化,取模

线性,平方显然很容被人猜出规律,所以最终是随机,那么是不是存在随机会出现取模的值相等的情况?

2.链地址法

而解决值不同,hash相同的方法有链地址法。

  1. //先从数组上取下原来的值,给塞到新的节点去,然后把新的节点再放到数组上。
  2. void createEntry(int hash, K key, V value, int bucketIndex) {
  3. Entry<K,V> e = table[bucketIndex];
  4. table[bucketIndex] = new Entry<>(hash, key, value, e);
  5. size++;
  6. }
  7. Entry(int h, K k, V v, Entry<K,V> n) {
  8. value = v;
  9. next = n;
  10. key = k;
  11. hash = h;
  12. }

将值不同hash相同的放在同一个地方,取值时遍历数据。

那么是不是存在一个地方有几个值,一个地方没有值的情况?

3.再hash法

就是当hash遇到重复的hash的时候,给自己在hash一次,然后hashCount+1,说明要多hash一次获取地址。

那么是不是存在hashCount+9999999,才能找到地址的情况?

4.建立一个公共溢出区

上面都有hashCount来记录hash的次数了,我直接新一个公共溢出区,用overIndex=99来记录不是更好吗?

那么,hash冲突基本解决,但是同样存在一个问题!

建立一个公共溢出区在map容器小的时候,作用不大,放在公共溢出区还不如扩容。只有当map的容器越大,扩容需要的空间越多,公共溢出区才实用。

5.java的hash冲突解决 链地址法

put方法分析

  1. public V put(K key, V value) {
  2. //hash()方法在上面已经出现过了,就不贴了
  3. return putVal(hash(key), key, value, false, true);
  4. }
  5.  
  6. final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
  7. boolean evict) {
  8. Node<K, V>[] tab;
  9. Node<K, V> p;
  10. int n, i;
  11. // tab为空则创建
  12. if ((tab = table) == null || (n = tab.length) == 0)
  13. n = (tab = resize()).length;
  14. // 计算index,并对null做处理
  15. if ((p = tab[i = (n - 1) & hash]) == null)
  16. tab[i] = newNode(hash, key, value, null);
  17. else {
  18. Node<K, V> e;
  19. K k;
  20. // 节点key存在,直接覆盖value
  21. if (p.hash == hash &&
  22. ((k = p.key) == key || (key != null && key.equals(k))))
  23. e = p;
  24. // 判断该链为红黑树
  25. else if (p instanceof TreeNode)
  26. e = ((TreeNode<K, V>) p).putTreeVal(this, tab, hash, key, value);
  27. // 该链为链表
  28. else {
  29. for (int binCount = 0; ; ++binCount) {
  30. if ((e = p.next) == null) {
  31. p.next = newNode(hash, key, value, null);
  32. //链表长度大于8转换为红黑树进行处理 TREEIFY_THRESHOLD = 8
  33. if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
  34. treeifyBin(tab, hash);
  35. break;
  36. }
  37. // key已经存在并相等,不往链表加值
  38. if (e.hash == hash &&
  39. ((k = e.key) == key || (key != null && key.equals(k))))
  40. break;
                 // key不存在,p,e是老值,p.next是新值
  41. p = e;
  42. }
  43. }
  44. if (e != null) { // existing mapping for key
  45. V oldValue = e.value;
  46. if (!onlyIfAbsent || oldValue == null)
  47. e.value = value;
  48. afterNodeAccess(e);
               //链地址法触发,返回老值,写了这么久代码才知道put返回不仅仅是null。
  49. return oldValue;
  50. }
  51. }
  52. ++modCount;
  53. // 超过最大容量 就扩容 threshold:单词解释--阈(yu)值,不念阀(fa)值!顺便学下语文咯。
  54. if (++size > threshold)
  55. resize();
  56. afterNodeInsertion(evict);
  57. return null;
  58. }

hash冲突解决和javahash冲突解决的更多相关文章

  1. Hash(散列函数)简单应用引出解决散列冲突的四种方法

    商店允许顾客通过电话订购商品,并在几天后上门自取.商店的数据库使用客户的电话号码作为其检索的关键字(客户知道自己的电话号码,而且这些电话关键字几乎是唯一的).如何组织商店的数据库,以允许更加高效的进行 ...

  2. PAT 甲级 1145 Hashing - Average Search Time (25 分)(读不懂题,也没听说过平方探测法解决哈希冲突。。。感觉题目也有点问题)

    1145 Hashing - Average Search Time (25 分)   The task of this problem is simple: insert a sequence of ...

  3. Java集合(九)哈希冲突及解决哈希冲突的4种方式

    Java集合(九)哈希冲突及解决哈希冲突的4种方式 一.哈希冲突 (一).产生的原因 哈希是通过对数据进行再压缩,提高效率的一种解决方法.但由于通过哈希函数产生的哈希值是有限的,而数据可能比较多,导致 ...

  4. Python 字典是如何解决哈希冲突的

    本文主要翻译自 so 上面的问题 Why can a Python dict have multiple keys with the same hash? 下 Praveen Gollakota 的答 ...

  5. 【面试普通人VS高手系列】HashMap是怎么解决哈希冲突的?

    常用数据结构基本上是面试必问的问题,比如HashMap.LinkList.ConcurrentHashMap等. 关于HashMap,有个学员私信了我一个面试题说: "HashMap是怎么解 ...

  6. 解决jquery版本冲突问题

    解决jQuery1.3.2和1.4.2的冲突.(测试通过) 第一步:在1.4.2的源代码的最后加上一句 var $j4 = jQuery.noConflict(true);//之所以在源码这里加,而不 ...

  7. Maven 解决JAR包冲突

    在JAR 冲突的情况下, 利用Eclipse方式解决JAR包冲突时比较方便简洁的,步骤如下 1. 在Eclipse 中打开pom.xml , 选择  “Dependency  Hierarchy” 2 ...

  8. sbt公布assembly解决jar包冲突 deduplicate: different file contents found in the following

    一个.问题定义 近期使用sbt战斗assembly发生故障时,包,在package什么时候,发生jar包冲突/文件冲突,两个相同class来自不同jar包classpath内心冲突. 有关详细信息:我 ...

  9. 关于Discuz与jQuery冲突问题的亲测解决方法

    最近的一个项目整合dede和discuz程序,客户要求风格统一,所以有很多样式及特效都是要公用的.其中jQuery库定义的函数$()正好与discuz的comme.js中函数一样,这样就冲突了,导致d ...

随机推荐

  1. 小 M 的算式(dfs)

    [问题描述]小 M 在做数学作业的时候遇到了一个有趣的问题:有一个长度为 n 的数字串 S,小 M 需要在数字之间填入若干个“+”和恰好一个“=”,使其成为一个合法的等式.如对于 S=“2349”,可 ...

  2. H - the Sum of Cube(水题)

    A range is given, the begin and the end are both integers. You should sum the cube of all the intege ...

  3. 设计一个MQ的考虑点

    转自: https://segmentfault.com/a/1190000004461970 序 这里总结下MQ的研究点,以及如果要自己设计一个MQ应该考虑的因素. 考虑点 1.远程通信功能 (1) ...

  4. wget使用技巧

    以下内容为转载: wget 是一个命令行的下载工具.对于我们这些 Linux 用户来说,几乎每天都在使用它.下面为大家介绍几个有用的 wget 小技巧,可以让你更加高效而灵活的使用 wget. $ w ...

  5. BS总结篇­

    学习Web开发差不多三个月了,这个阶段的学习给自己带来的更多的是视觉的盛宴.从CS的世界一下子来到了BS的地盘,心中除了惊喜还是惊喜.在这里还是希望自己对这三月所学的东西做一个阶段性的总结. 话不多说 ...

  6. 博弈论-一堆nim博弈合在一起

    今天A了张子苏大神的的题,感觉神清气爽. 一篇对于多层nim博弈讲的很透彻的博文:http://acm.hdu.edu.cn/forum/read.php?fid=9&tid=10617 我来 ...

  7. 最短路【bzoj2464】: 中山市选[2009]小明的游戏

    2464: 中山市选[2009]小明的游戏 Description 小明最近喜欢玩一个游戏.给定一个n * m的棋盘,上面有两种格子#和@.游戏的规则很简单:给定一个起始位置和一个目标位置,小明每一步 ...

  8. 理解Javascript_01_理解内存分配

    理解Javascript_01_理解内存分配 转载自:http://www.cnblogs.com/fool/archive/2010/10/07/1845226.html   在正式开始之前,我想先 ...

  9. Ruby truthy and falsey

    在Ruby里只有false 和nil表示falsey link: https://gist.github.com/jfarmer/2647362

  10. XStream -- a simple library to serialize objects to XML and back again

    Link :http://xstream.codehaus.org/index.html http://www.cnblogs.com/hoojo/archive/2011/04/22/2025197 ...