全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

java HashMap内部实现原理详解

详解HashMap内部实现原理

内部数据结构

static class Entry<K,V> implements Map.Entry<K,V> {
    final K key;
    V value;
    Entry<K,V> next;
    int hash;

从上面的数据结构定义可以看出,HashMap存元素的是一组键值对的链表,以什么形式存储呢

transient Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_TABLE;

可以看出,是以数组形式储存,好的,现在我们知道,HashMap是以数组形式存储,每个数组里面是一个键值对,这个键值对还可以链接到下个键值对。如下图所示:

hashmap的添加

public V put(K key, V value) {
    if (table == EMPTY_TABLE) {
      inflateTable(threshold);
    }
    if (key == null)
      return putForNullKey(value);
    int hash = hash(key);
    int i = indexFor(hash, table.length);
    for (Entry<K,V> e = table[i]; e != null; e = e.next) {
      Object k;
      if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
        V oldValue = e.value;
        e.value = value;
        e.recordAccess(this);
        return oldValue;
      }
    }

    modCount++;
    addEntry(hash, key, value, i);
    return null;
  }

这里可以看出,hashmap的添加,首先根据一个entry的hash属性去查找相应的table元素i,然后看这个位置是否有元素存在,如果没有,直接放入,如果有,遍历此次链表,加到表尾

删除

final Entry<K,V> removeEntryForKey(Object key) {
    if (size == 0) {
      return null;
    }
    int hash = (key == null) ? 0 : hash(key);
    int i = indexFor(hash, table.length);
    Entry<K,V> prev = table[i];
    Entry<K,V> e = prev;

    while (e != null) {
      Entry<K,V> next = e.next;
      Object k;
      if (e.hash == hash &&
        ((k = e.key) == key || (key != null && key.equals(k)))) {
        modCount++;
        size--;
        if (prev == e)
          table[i] = next;
        else
          prev.next = next;
        e.recordRemoval(this);
        return e;
      }
      prev = e;
      e = next;
    }

    return e;
  }

删除的话,还是先根据hash在table数组中查找,然后再根据equals在链表中进行查找,这个也是为什么hashmap和hashset等以hash方式进行存储的数据结构要求实现两个方法hashcode和equalsd的原因

学过hash的人都知道,hash表的性能和hash冲突的发生次数有很大关系,但有不能申请过长的table表浪费空间,所以这里有了我们的resize函数

扩容机制

void resize(int newCapacity) {
    Entry[] oldTable = table;
    int oldCapacity = oldTable.length;
    if (oldCapacity == MAXIMUM_CAPACITY) {
      threshold = Integer.MAX_VALUE;
      return;
    }

    Entry[] newTable = new Entry[newCapacity];
    transfer(newTable, initHashSeedAsNeeded(newCapacity));
    table = newTable;
    threshold = (int)Math.min(newCapacity * loadFactor, MAXIMUM_CAPACITY + 1);
  }

这个方法会在put的时候调用,上面put的时候先调用 addEntry(hash, key, value, i);方法,然后看addEntry方法

void addEntry(int hash, K key, V value, int bucketIndex) {
    if ((size >= threshold) && (null != table[bucketIndex])) {
      resize(2 * table.length);
      hash = (null != key) ? hash(key) : 0;
      bucketIndex = indexFor(hash, table.length);
    }

    createEntry(hash, key, value, bucketIndex);
  }

上面可以看出那么 HashMap 当 HashMap 中的元素个数超过数组大小 *loadFactor 时,就会进行数组扩容,loadFactor 的默认值为 0.75,这是一个折中的取值。也就是说,默认情况下,数组大小为 16,那么当 HashMap 中元素个数超过 16*0.75=12 的时候,就把数组的大小扩展为 2*16=32,即扩大一倍,然后重新计算每个元素在数组中的位 置,而这是一个非常消耗性能的操作,所以如果我们已经预知 HashMap 中元素的个数,那么预设元素的个数能够有效的提高 HashMap 的性能。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# java  # HashMap  # HashMap原理  # HashMap详解及实例  # java无锁hashmap原理与实现详解  # Java HashMap的工作原理  # 详解 Java HashMap 实现原理  # 深入解析java HashMap实现原理  # java中HashMap的原理分析  # java HashMap 的工作原理详解  # Java 8中HashMap的底层原理解析  # Java HashMap底层实现原理  # Java中的HashMap实现原理深入理解  # 可以看出  # 键值  # 数据结构  # 链表  # 的是  # 组中  # 是一个  # 就会  # 还可以  # 遍历  # 会在  # 这是一个  # 的人都  # 希望能  # 就把  # 如果没有  # 然后再  # 所示  # 而这  # 谢谢大家 


相关文章: 模具网站制作流程,如何找模具客户?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  清除minerd进程的简单方法  商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?  专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?  东莞专业制作网站的公司,东莞大学生网的网址是什么?  如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法  道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?  西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?  如何在IIS中新建站点并配置端口与IP地址?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】  早安海报制作网站推荐大全,企业早安海报怎么每天更换?  如何在IIS服务器上快速部署高效网站?  南平网站制作公司,2025年南平市事业单位报名时间?  移民网站制作流程,怎么看加拿大移民官网?  图册素材网站设计制作软件,图册的导出方式有几种?  建站之星在线客服如何快速接入解答?  广州美橙建站如何快速搭建多端合一网站?  建站中国官网:模板定制+SEO优化+建站流程一站式指南  网站制作服务平台,有什么网站可以发布本地服务信息?  大连 网站制作,大连天途有线官网?  建站主机与虚拟主机有何区别?如何选择最优方案?  常州自助建站工具推荐:低成本搭建与模板选择技巧  动图在线制作网站有哪些,滑动动图图集怎么做?  Swift开发中switch语句值绑定模式  如何选择服务器才能高效搭建专属网站?  b2c电商网站制作流程,b2c水平综合的电商平台?  小型网站制作HTML,*游戏网站怎么搭建?  魔方云NAT建站如何实现端口转发?  定制建站如何定义?其核心优势是什么?  济南网站制作的价格,历城一职专官方网站?  深圳网站制作的公司有哪些,dido官方网站?  如何挑选最适合建站的高性能VPS主机?  宝塔新建站点报错如何解决?  如何快速搭建高效WAP手机网站吸引移动用户?  ,石家庄四十八中学官网?  如何用y主机助手快速搭建网站?  建站主机选购指南:核心配置优化与品牌推荐方案  linux top下的 minerd 木马清除方法  非常酷的网站设计制作软件,酷培ai教育官方网站?  如何在景安服务器上快速搭建个人网站?  已有域名建站全流程解析:网站搭建步骤与建站工具选择  制作电商网页,电商供应链怎么做?  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  ,南京靠谱的征婚网站?  如何注册花生壳免费域名并搭建个人网站?  公司网站设计制作厂家,怎么创建自己的一个网站?  贸易公司网站制作流程,出口贸易网站设计怎么做?  如何在VPS电脑上快速搭建网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。