从hashmap说起

作者: xpbob | 来源:发表于2018-10-26 21:20 被阅读1次

说到hashmap我们能想到什么呢

hash

hashmap的hash方法极大的避免了hash冲突。他通过高16位和低16位做异或操作。保证了32位都参加运算。

    static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }

为了保证hashcode尽量的分散在数组中,再算位置的时候使用了容量-1

i = (n - 1) & hash

当hash冲突的时候,链会越来越长,所以解决冲突的时候可能造成链特别长,jdk8中做了改良,当链超过8时候,转化成红黑树。

hash的发散

数据库扩容
因为容量是2的次方,所以n-1后面的位数都是1。保证了在hashcode的值不冲突时,分散也不冲突。
在扩容的时候2次方的好处,就提现出来了,原来同一个槽的数据只会分布在原来的位置或者原来槽的位置+一个原来的距离。举个例子,1,2,3,4。和2取模,结果是1,0,1,0。现在和4取模,就变成了1,2,3,0。原来都在1号位置的数据,现在在1和3,原来在0号位置的,现在在0和2。数据都加了一个扩容的数量。
利用这个特性,可以做到数据库不停机在线扩容。
数据库有主备,当需要把2台机器扩容成4台的时候,就可以把主备都配上,让数据分散到4台机器上,位置就是如上的形式分配。然后解除主备,都成为主,于此同时加新的机器作为备,并且在合理的机会处理冗余数据。

hash冲突解决
hashmap使用的是拉链发解决hash冲突,jdk里还有一种hash冲突的实现,开放定址法。实现类是ThreadLocalMap。ThreadLocalMap是一个key为弱引用的ThreadLocal,值为一个强引用。

           for (Entry e = tab[i];
                 e != null;
                 e = tab[i = nextIndex(i, len)]) {

当发生hash冲突的时候就直接把位置往后移动一位。

        private static int nextIndex(int i, int len) {
            return ((i + 1 < len) ? i + 1 : 0);
        }

相关文章

  • 从hashmap说起

    说到hashmap我们能想到什么呢 hash hashmap的hash方法极大的避免了hash冲突。他通过高16位...

  • Java『数据容器』

    HashMap 先从Java中Object的hashCode()方法说起,从方法注释的第一行可以看到该方法的存在主...

  • 关于 Java HashMap、HashTable 的学习笔记

    HashMap HashMap 的数据结构 HashMap 的底层实现是 Entry数组,(如图1结构)。 从 H...

  • JDK1.8中HashMap底层实现原理

    接下来会从以下几个方面介绍 HashMap 源码相关知识: 1、HashMap 存储结构 2、HashMap 各常...

  • HashMap源码分析(JDK1.8)

    HashMap简介 JangGwa从源码角度带你熟悉一下JDK1.8的HashMap,首先简单介绍下HashMap...

  • 从我写《说起》说起

    “知青”是当代国人既绕不开,又躲不过的一个沉重话题。不唯是涉及1700万人的上一辈和下一代如此庞大的群体,而是...

  • [转]一文读懂HashMap

    本文准备从以下几个方面去讲解HashMap:1)HashMap源码详细分析2)HashMap为什么是线程不安全的?...

  • 为什么HashMap的key允许空值,而HashTable却不允

    1.从源码分析 HashMap从源码分析: HashMap在put的时候会调用hash()方法来计算key的has...

  • 从死亡说起

    庄子曾说:生也有涯,而知也无涯。 我们的生命是有限度的,而知识是没有限度的。 随着年龄的增大,我们会开始问自己这样...

  • 从别字说起

    现在网络上别字不少,隐约还变成一种时尚。我是不抵触的,因为那都是聊天啊微薄啊等环境,是娱乐化的,博得一笑而已。不过...

网友评论

    本文标题:从hashmap说起

    本文链接:https://www.haomeiwen.com/subject/vtaltqtx.html