当前位置: 首页 > news >正文

HashMap散列表的相关知识点

目录

1、HashMap的数据结构

2、HashMap中的链表和红黑树有什么区别?

3、HashMap的扩容机制是怎样的?

4、如何在HashMap中根据键获取值?

5、HashMap和HashTable有什么区别?


1、HashMap的数据结构

Hash表是一种基于Hash算法实现的数据结构,它通过将关键字映射到Hash表中的一个位置来访问记录,以加快查找的速度。在Java中,HashMap就是基于Hash表实现的一种数据结构。HashMap底层结构主要由数组和链表(或红黑树)组成。

具体来说,HashMap内部维护了一个Entry数组,每个Entry包含了一个key-value键值对,当我们向HashMap中添加元素时,HashMap会根据key的HashCode值计算出该元素在Entry数组中的位置,如果该位置上已经有元素了,那么就会以链表的形式将新元素添加到该位置的链表末尾,如果链表长度超过了阈值(默认为8),那么就会将链表转化为红黑树,以提高查找效率。当HashMap中的元素数量达到了容量的75%时,就会触发扩容操作,HashMap会重新计算每个元素在新数组中的位置,并将所有元素重新放置到新数组中。

2、HashMap中的链表和红黑树有什么区别?

HashMap中的链表和红黑树都是用来解决哈希冲突的方法,但它们的实现方式不同。当链表长度达到一定阈值时,链表会转换为红黑树,以提高查找效率。具体区别如下:
1. 链表:链表是一种基本的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。在HashMap中,当哈希冲突发生时,新的元素会被插入到链表的头部,因此链表的顺序是按照插入顺序排列的。链表的查找效率为O(n),其中n为链表长度。
2. 红黑树:红黑树是一种自平衡的二叉查找树,它的查找效率为O(logn),其中n为树的节点数。在HashMap中,当链表长度达到一定阈值时,链表会被转换为红黑树,以提高查找效率。红黑树的节点比链表节点占用更多的空间,因此只有在链表长度较长时才会转换为红黑树。

3、HashMap的扩容机制是怎样的?

HashMap的扩容机制是指在HashMap中存储的元素数量达到一定阈值时,自动增加HashMap的容量,以便能够继续存储更多的元素。具体来说,当HashMap中存储的元素数量超过了负载因子(load factor)与当前容量的乘积时,就会触发扩容操作。默认情况下,负载因子的值为0.75,也就是说,当HashMap中存储的元素数量超过了当前容量的0.75倍时,就会触发扩容操作。

在扩容操作中,HashMap会创建一个新的数组,其容量为原数组的两倍,并将原数组中的所有元素重新分配到新数组中。具体来说,HashMap会遍历原数组中的每个元素,然后根据元素的哈希值和新数组的长度计算出元素在新数组中的位置,并将元素存储到该位置上。由于元素在新数组中的位置可能与在原数组中的位置不同,因此在扩容操作中需要重新计算元素的哈希值和位置。

需要注意的是,由于扩容操作需要重新计算元素的哈希值和位置,因此在扩容操作中可能会导致HashMap的性能下降。为了避免这种情况,可以在创建HashMap时指定初始容量和负载因子,以便在存储元素时就能够避免或减少扩容操作的发生。

4、如何在HashMap中根据键获取值?

在HashMap中,可以使用get()方法根据键获取值。

// 创建一个HashMap对象
Map<String, Integer> hashMap = new HashMap<>();
hashMap.put("apple", 1);
hashMap.put("banana", 2);
hashMap.put("orange", 3);// 根据键获取值
int value = hashMap.get("apple");
System.out.println(value); // 输出:1

另外,如果要遍历HashMap中的所有键值对,可以使用entrySet()方法获取键值对集合,然后使用for循环遍历集合。

// 遍历HashMap中的所有键值对
for (Map.Entry<String, Integer> entry : hashMap.entrySet()) {String key = entry.getKey();int value = entry.getValue();System.out.println(key + " : " + value);
}

5、HashMap和HashTable有什么区别?

HashMap和HashTable都是基于哈希表实现键值映射的工具类,但它们之间有以下几个区别:

  1. 线程安全性:HashTable是线程安全的,而HashMap不是。这是因为HashTable的所有公共方法都是同步的,而HashMap没有这个特性。如果需要在多线程环境下使用HashMap,可以考虑使用ConcurrentHashMap。

  2. null键和null值:HashTable不允许null键和null值,而HashMap允许null键和null值。

  3. 继承关系:HashTable是基于Dictionary类的,而HashMap是继承AbstractMap类的。

  4. 初始容量和扩容机制:HashTable的初始容量为11,而HashMap的初始容量为16。HashTable的扩容机制是当哈希表中元素数量超过当前容量的一半时,会重新调整容量为原来的2倍加1;而HashMap的扩容机制是当哈希表中元素数量超过当前容量的75%时,会重新调整容量为原来的2倍。

  5. 性能:由于HashTable是线程安全的,所以在多线程环境下性能会受到影响。而HashMap在单线程环境下性能更好。

参考:

【Java集合】HashMap系列(一)——底层数据结构分析_hashmap底层数据结构-CSDN博客

【精选】HashMap之 链表转红黑树_hashmap转红黑树-CSDN博客

jdk1.8中HashMap底层链表转红黑树的阈值为什么是8?红黑树转链表为什么是6?_hashmap链化和树化阈值为什么是6和8_杨大仙儿..的博客-CSDN博客

【精选】[Java] HashMap是如何实现的?扩容机制是什么?树化机制知道吗?结合源码带你理解HashMap的原理。_javahashmap扩容机制-CSDN博客

java hashmap 获取_java – 如何从HashMap列表中获取值?-CSDN博客

【精选】HashMap和Hashtable的详细区别_hashtable和hashmap的区别详解_IT枫斗者的博客-CSDN博客


相关文章:

  • Python Flask: 构建轻量级、灵活的Web应用
  • 一键云端,AList 整合多网盘,轻松管理文件多元共享
  • jbase打印导出实现
  • TCP/IP详解卷一第三章“链路层”概要总结(未完编辑中)
  • 【ES6标准入门】JavaScript中的模块Module语法的使用细节:export命令和imprt命令详细使用,超级详细!!!
  • QQ五毛项目记
  • openGauss学习笔记-126 openGauss 数据库管理-设置账本数据库-归档账本数据库
  • [acwing周赛复盘] 第 94 场周赛20230311
  • 解决:微软在登录时总是弹出需要家长或监护人同意才能使用该账户并且不断循环?
  • Elasticsearch:检索增强生成 (Retrieval Augmented Generation -RAG)
  • Spring 事务和事务传播机制
  • 2023年第九届数维杯国际大学生数学建模挑战赛
  • 一文图解爬虫_姊妹篇(spider)
  • 推介会如何做好媒体宣传
  • alias linux 命令别名使用
  • python3.6+scrapy+mysql 爬虫实战
  • Apache Pulsar 2.1 重磅发布
  • Apache Spark Streaming 使用实例
  • Git 使用集
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Python十分钟制作属于你自己的个性logo
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • SwizzleMethod 黑魔法
  • use Google search engine
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 搭建gitbook 和 访问权限认证
  • 关于Flux,Vuex,Redux的思考
  • 你不可错过的前端面试题(一)
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 时间复杂度与空间复杂度分析
  • 消息队列系列二(IOT中消息队列的应用)
  • 在weex里面使用chart图表
  • 主流的CSS水平和垂直居中技术大全
  • UI设计初学者应该如何入门?
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​渐进式Web应用PWA的未来
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #图像处理
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • %@ page import=%的用法
  • (1)(1.13) SiK无线电高级配置(五)
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)ssm码农论坛 毕业设计 231126
  • (生成器)yield与(迭代器)generator
  • (转)一些感悟
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .NET 读取 JSON格式的数据
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .net(C#)中String.Format如何使用
  • .net与java建立WebService再互相调用
  • .考试倒计时43天!来提分啦!