iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >常见的HashMap迭代方式有哪些
  • 503
分享到

常见的HashMap迭代方式有哪些

2023-06-27 11:06:51 503人浏览 八月长安
摘要

这篇文章主要介绍了常见的HashMap迭代方式有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇常见的HashMap迭代方式有哪些文章都会有所收获,下面我们一起来看看吧。一、 HashMap介绍HashMap

这篇文章主要介绍了常见的HashMap迭代方式有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇常见的HashMap迭代方式有哪些文章都会有所收获,下面我们一起来看看吧。

一、 HashMap介绍

HashMap简介:HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。HashMap 继承于AbstractMap,实现了MapCloneablejava.io.Serializable接口。HashMap 的实现不是同步的,这意味着它不是线程安全的。它的keyvalue都可以为null。此外,HashMap中的映射不是有序的。HashMap 的实例有两个参数影响其性能:“初始容量” 和 “加载因子”。容量 是哈希表中桶的数量,初始容量 只是哈希表在创建时的容量。加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行rehash操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。通常,默认加载因子是 0.75, 这是在时间和空间成本上寻求一种折衷。加载因子过高虽然减少了空间开销,但同时也增加了查询成本(在大多数 HashMap 类的操作中,包括 getput 操作,都反映了这一点)。在设置初始容量时应该考虑到映射中所需的条目数及其加载因子,以便最大限度地减少 rehash 操作次数。如果初始容量大于最大条目数除以加载因子,则不会发生 rehash 操作。

HashMap的构造函数

HashMap共有4个构造函数,如下:

// 默认构造函数。HashMap()// 指定“容量大小”的构造函数HashMap(int capacity)// 指定“容量大小”和“加载因子”的构造函数HashMap(int capacity, float loadFactor)// 包含“子Map”的构造函数HashMap(Map<? extends K, ? extends V> map)

二、jdk7 中 HashMap 底层原理

HashMapJDK7 或者 JDK8 中采用的基本存储结构都是数组+链表形式。

上图中左边橙色区域是哈希表,右边蓝色区域为链表,链表中的元素类型为 Entry,它包含四个属性分别是:

  • K key

  • V value

  • int hash

  • Entry next

那么为什么会出现数组+链表形式的存储结构呢?这里简单地阐述一下,后续将以源码的形式详细介绍。 我们在使用 HashMap.put("Key", "Value")方法存储数据的时候,底层实际是将keyvalueEntry的形式存储到哈希表中,哈希表是一个数组,那么它是如何将一个 Entry 对象存储到数组中呢?是如何确定当前 keyvalue 组成的 Entry 该存到数组的哪个位置上,换句话说是如何确定 Entry 对象在数组中的索引的呢?通常情况下,我们在确定数组的时候,都是在数组中挨个存储数据,直到数组全满,然后考虑数组的扩容,而 HashMap 并不是这么操作的。在 Java 及大多数面向对象编程语言中,每个对象都有一个整型变量 hashcode,这个 hashcode 是一个很重要的标识,它标识着不同的对象,有了这个 hashcode,那么就很容易确定 Entry 对象的下标索引了,在 Java 语言中,可以理解 hashcode 转化为数组下标是按照数组长度取模运算的,基本公式如下所示:

int index = HashCode(key) % Array.length

实际上,在 JDK 中哈希函数并没有直接采取取模运算,而是利用了位运算的方式来提高性能,在这里我们理解为简单的取模运算。 我们知道了对 Key 进行哈希运算然后对数组长度进行取模就可以得到当前 Entry 对象在数组中的下标,那么我们可以一直调用 HashMapput 方法持续存储数据到数组中。但是存在一种现象,那就是根据不同的 Key 计算出来的结果有可能会完全相同,这种现象叫作“哈希冲突”。既然出现了哈希冲突,那么发生冲突的这个数据该如何存储呢?哈希冲突其实是无法避免的一个事实,既然无法避免,那么就应该想办法来解决这个问题,目前常用的方法主要是两种,一种是开放寻址法,另外一种是链表法。 开放寻址法是原理比较简单,就是在数组里面“另谋高就”,尝试寻找下一个空档位置。而链表法则不是寻找下一个空档位置,而是继续在当前冲突的地方存储,与现有的数据组成链表,以链表的形式进行存储。HashMap 的存储形式是数组+链表就是采用的链表法来解决哈希冲突问题的。具体的详细说明请继续往下看。 在日常开发中,开发者对于 HashMap 使用的最多的就是它的构造方法、put 方法以及get 方法了,下面就开始详细地从这三个方法出发,深入理解HashMap 的实现原理。

三、HashMap put、get 方法流程图

上面中 get 流程图画得稍微比正常的要复杂一些,只是为了描述流程更加清晰。

四、常见的 HashMap 的迭代方式

在实际开发过程中,我们对于 HashMap 的迭代遍历也是常见的操作,HashMap 的迭代遍历常用方式有如下几种:

  • 方式一:迭代器模式

Map<String, String> map = new HashMap<>(16);Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();while (iterator.hasNext()) {    Map.Entry<String, String> next = iterator.next();    System.out.println(next.geTKEy() + ":" + next.getValue());}
  • 方式二:遍历 Set>方式

Map<String, String> map = new HashMap<>(16);for (Map.Entry<String, String> entry : map.entrySet()) {    System.out.println(entry.getKey() + ":" + entry.getValue());}
  • 方式三:forEach 方式(JDK8 特性,lambda)

Map<String, String> map = new HashMap<>(16);map.forEach((key, value) -> System.out.println(key + ":" + value));
  • 方式四:keySet 方式

Map<String, String> map = new HashMap<>(16);Iterator<String> keyIterator = map.keySet().iterator();while (keyIterator.hasNext()) {    String key = keyIterator.next();    System.out.println(key + ":" + map.get(key));}

把这四种方式进行比较,前三种其实属于同一种,都是迭代器遍历方式,如果要同时使用到 keyvalue,推荐使用前三种方式,如果仅仅使用到 key,那么推荐使用第四种。

关于“常见的HashMap迭代方式有哪些”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“常见的HashMap迭代方式有哪些”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: 常见的HashMap迭代方式有哪些

本文链接: https://www.lsjlt.com/news/309862.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 常见的HashMap迭代方式有哪些
    这篇文章主要介绍了常见的HashMap迭代方式有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇常见的HashMap迭代方式有哪些文章都会有所收获,下面我们一起来看看吧。一、 HashMap介绍HashMap...
    99+
    2023-06-27
  • 有哪些常见换ip的方式
    这篇文章主要介绍“有哪些常见换ip的方式”,在日常操作中,相信很多人在有哪些常见换ip的方式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”有哪些常见换ip的方式”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-20
  • 常见的DDOS攻击方式有哪些
    常见的DDOS攻击方式有:1、SYN/ACK Flood攻击,通过向受害主机发送大量伪造源IP和源端口的SYN或ACK包,导致主机缓存资源被耗尽或忙于发送回应包而造成拒绝服务;2、TCP全连接攻击,通过许多僵尸主机不断与受害服务器建立大量的...
    99+
    2024-04-02
  • Vue2常见开局方式有哪些
    这篇文章给大家分享的是有关Vue2常见开局方式有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在SF问题中看到了一个关于vue-cli中的template问题,问题是这样的:...
    99+
    2024-04-02
  • Redis常见使用方式有哪些
    这篇“Redis常见使用方式有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Redis常见使用方式有哪些”文章吧。一、常...
    99+
    2023-06-05
  • HashMap中有哪些遍历方式
    这篇文章主要为大家展示了“HashMap中有哪些遍历方式”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“HashMap中有哪些遍历方式”这篇文章吧。一、前言随着 JDK 1.8 Streams A...
    99+
    2023-06-20
  • appium中常见的点击方式有哪些
    小编给大家分享一下appium中常见的点击方式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!首先从appium库里面导入webdriver,然后webdri...
    99+
    2023-06-29
  • 有哪些常见的网络推广方式
    本篇文章给大家分享的是有关有哪些常见的网络推广方式,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。网络推广(web promotion)是以企业产品或服务为核心内容,建立网站、A...
    99+
    2023-06-14
  • 负载均衡常见的方式有哪些
    负载均衡常见的方式有以下几种:1. 基于网络层的负载均衡:通过路由器或交换机等网络设备,根据目标IP地址或端口号来分发请求。常见的网...
    99+
    2023-09-01
    负载均衡
  • Python中有哪些常见的加密方式
    Python中有哪些常见的加密方式,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前言我们所说的加密方式,都是对二进制编码的格式进行加密的,对应到Python中,则是我们的B...
    99+
    2023-06-02
  • 常见的JavaScript代码优化方法有哪些
    本篇内容主要讲解“常见的JavaScript代码优化方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“常见的JavaScript代码优化方法有哪些”吧!1、NUll、Undefined、&...
    99+
    2023-06-27
  • JavaScript中数组常用的迭代处理方法有哪些
    这篇文章主要介绍“JavaScript中数组常用的迭代处理方法有哪些”,在日常操作中,相信很多人在JavaScript中数组常用的迭代处理方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方...
    99+
    2024-04-02
  • 常见的字符串常量表示方式有哪些?
    字符串常量是程序中使用的固定文本值。在大多数编程语言中都有不同的方法来表示字符串常量。下面将介绍一些常见的字符串常量表示方法,并给出具体的代码示例。单引号表示法:在一些编程语言中,可以使用单引号括起来的字符来表示字符串常量。这种表示方法通常...
    99+
    2023-12-27
    字符串常量 表示方法
  • 常见的浏览器存储方式有哪些
    这篇文章给大家分享的是有关常见的浏览器存储方式有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Cookie基于HTTP规范,用来识别用户。Cookie是服务器发送到浏览器的一...
    99+
    2024-04-02
  • 小程序的常见推广方式有哪些
    这篇文章将为大家详细讲解有关小程序的常见推广方式有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、巧用微信搜索入口,用小程序名称抢排位小程序的排名跟名称、描述、上线时间、用户访问量和小程序的综合质量...
    99+
    2023-06-27
  • python网站常见的反扒方式有哪些
    本文小编为大家详细介绍“python网站常见的反扒方式有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“python网站常见的反扒方式有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。网站反爬虫方式:&nb...
    99+
    2023-06-27
  • 常见的数据库存储方式有哪些
    常见的数据库存储方式包括:1. 关系型数据库:使用表格的形式存储数据,如MySQL、Oracle、SQL Server等。2. 非关...
    99+
    2023-06-08
    数据库存储 数据库
  • PHP数组合并的常见方式有哪些?
    在 php 中,将数组合并有三种常见方法:使用 array_merge() 函数、+ 运算符(适用于键名不冲突的情况)以及 array_combine() 函数(用于创建键值对数组)。在...
    99+
    2024-04-28
    php数组合并 数组合并方式 键值对
  • Android常见的图片压缩方式有哪些
    小编给大家分享一下Android常见的图片压缩方式有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!先给出一组数据原图:width:2976; height:2976原图实际:--->byte:2299820 Mb...
    99+
    2023-06-15
  • Python常见的数据加密方式有哪些
    这篇文章主要介绍了Python常见的数据加密方式有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python常见的数据加密方式有哪些文章都会有所收获,下面我们一起来看看吧。前言:常见的加密算法基本分为这几类...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作