`
轻指飞扬
  • 浏览: 32005 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

解析HashMap的存储方式

    博客分类:
  • Java
阅读更多
Java集合中,HashMap的点名率很高,这归功于它的Key-Value键值对结构,还有它不错的效率。HashMap由于运用Hash算法定位并配合它的存储方式使它有了不错的效率,理解
它的存储方式对我们自己日常开发也有启发作用,就让我们一同来学一些吧~


首先看它的构造方法
HashMap()
          构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap。
HashMap(int initialCapacity)
          构造一个带指定初始容量和默认加载因子 (0.75) 的空 HashMap。
HashMap(int initialCapacity, float loadFactor)
          构造一个带指定初始容量和加载因子的空 HashMap。

我们来看一下HashMap(int initialCapacity, float loadFactor)构造方法吧




在这个构造方法中可以看出,HashMap是用一个名为table的数组实现的,其数组元素是Entry,由于数组长度是固定的,而HashMap这种集合肯定是需要长度可变的,所以我们可以看到构造器中有capacity、loadFactor、threshold等几个变量的操作形成一套变换table数组长度的算法。
数组元素Entry到底是什么东西?是不是它使我们可以通过Key定位到Value呢?




Entry好像结构很简单,我们看到了key和value,键值对对应的功能就是出自于这两个家伙。等等我们还看到什么一个名为next的Entry<K,V>变量,这让我们联想起Entry是不是会作为链表元素出现呢?可他已经是数组元素了啊?
好吧,我们来看看HashMap的put方法




看到他的覆盖条件了吗?两个key的hash值一样还不够,还必须要equal的。读到这边我们就知道hash值相等的两个值可能并不equal。就是说多个不同的元素可能拥有同一hash值,就是说多个不同的元素会在同一个数组元素中。这时我们想到了前面的Entry的next变量。看到覆盖处理中for循环的迭代条件for (Entry<K,V> e = table[i]; e != null; e = e.next)与覆盖条件 if (e.hash == hash && ((k = e.key) == key || key.equals(k))) 我们就可以确认,它们确实是用链表实现的。
再让我们来看看它addEntry方法吧,它是怎么处理链表的




看到这里大家应该都知道了吧~
HashMap的存储方式用图片来展示一下


  • 大小: 20.1 KB
  • 大小: 25.5 KB
  • 大小: 25.7 KB
  • 大小: 17.3 KB
  • 大小: 33.3 KB
分享到:
评论

相关推荐

    JAVA之hashmap源码分析-haha:已弃用的Java库可自动分析Android堆转储

    JAVA之hashmap源码分析 无头Android堆分析器 “哈哈!” -纳尔逊 此存储库已弃用 创建该项目的目的是通过重新打包其他存储库中的堆转储解析器来提供堆转储解析器。 LeakCanary现在有它自己的。 该解析器在Maven ...

    sourcecode:原始学习1)HashMap 2)NIO编程模型,利用Java的NIO实现完成聊天室程序

    且ctrl + f5会避免请求浏览器自身缓存直接向目标网址发起请求DNS域名解析过程a)浏览器缓存b)操作系统文件c)本地DNS服务器(ISP的LDNS)查看缓存(有-&gt;返回)d)根服务器e)gTLD主域名服务器f)gTLD主域名服务器...

    LinkedHashMap 核心源码解析

    无序的 HashMap ,按 key 排序的 TreeMap ,那么 LinkedHashMap特点在哪呢 – 维护插入的顺序.LinkedHashMap 也同样出自于 Bloch之手(开发了整个 Java 集合框架的男人). 元素存储关系 红黄箭头:元素添加顺序 蓝...

    strason:Json解析器,保留字段顺序并将数字存储为字符串,保留其完整数据

    该项目在三个主要方面与其他Json解析器不同: 数字将作为字符串读取并存储为字符串。 调用代码负责解析它们。 (已验证它们是有效的Json编号。) Json对象中字段的顺序会保留下来,以供对此感兴趣的应用程序使用。 ...

    leetcode双人赛-LeetCode:LeetCode上的算法解析

    做存储,value为num值,key为目标值减去value后需要的值。 public class Solution { public int[] twoSum(int[] nums, int target) { int[] answer = new int[2]; HashMap hashMap = new HashMap&lt;&gt;(); for (int i...

    c语言难点分析整理,C语言

    38. 右左法则- 复杂指针解析 189 39. 回车和换行的区别 192 40. 堆和堆栈的区别 194 41. 堆和堆栈的区别 198 42. 如何写出专业的C头文件 202 43. 打造最快的Hash表 207 44. 指针与数组学习笔记 222 45. 数组不是指针...

    leetcode算法题主函数如何写-one_algorithm_one_day:每天一道算法题

    [ES中对象在底层的储存方式,ES6 MAP/SET在底层是否采用hashmap/红黑树存储? EnumerateObjectProperties EnumerableOwnProperties] [最长上升子序列] # 1. 求两个已排序数组的中位数 There are two sorted arrays ...

    TheirNotes::ledger: 《互联网后端知识大全》「前人栽树, 后人乘凉; 它山之石, 可以攻玉」java

    Java IOJVM垃圾收集CMSG1ZGC元空间字节码操作JVM 调优分布式分布式算法PaxosRaftBFT分布式锁Redis 分布式锁分布式事务MySQL查询语句基本原理innodb 存储引擎:sparkles:缓存Redis底层原理开源框架Spring源码解析:...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    put()方法-向HashMap存储键值对,Value&gt; 65 get()方法-根据Key从HashMap中取Value 66 HashMap的特点总结: 66 【集合】HashMap在并发场景下的问题和解决方案 67 多线程put后可能导致get死循环 67 多线程put的时候可能...

    安卓毕业设计app项目源码6-android-interviewer:安卓面试官

    这里进行解析 java集合框架Collection collection是集合框架的根,定义了集合操作的通用行为 继他之后存在四个子接口 list,map,set,queue list是有序collection接口 实现: arraylist是基于数组实现list接口的 线程...

    java8集合源码分析-CollectionDemo:自己复习集合框架时候的例子

    内部使用的是一个HashMap集合key值当做我们存储的对象,value值是一个固定的Object对象 保证唯一性:元素hashCode和equals方法。hashCode方法相同,判断equals方法 ---LinkedHashSet: 有序,是HashSet的子类 2....

    web-search-engine:Java中的Web搜索引擎,使用术语频率-逆频率文档(TFIDF)

    这些概念用于开发此Web搜索引擎倒排索引TST(三元搜索Trie)用于存储索引文档词频-反向文档频率,用于衡量一个单词相对于其他文档而言有多重要搜寻器中的HashSet,用于检查是否在固定时间内对网址进行了爬网HashMap...

    千方百计笔试题大全

    203、编程用JAVA解析XML的方式. 49 204、EJB2.0有哪些内容?分别用在什么场合? EJB2.0和EJB1.1的区别? 51 205、EJB与JAVA BEAN的区别? 51 206、EJB的基本架构 51 207、MVC的各个部分都有那些技术来实现?如何实现? 52...

    java面试宝典

    203、编程用JAVA解析XML的方式. 49 204、EJB2.0有哪些内容?分别用在什么场合? EJB2.0和EJB1.1的区别? 51 205、EJB与JAVA BEAN的区别? 51 206、EJB的基本架构 51 207、MVC的各个部分都有那些技术来实现?如何实现? 52...

    免费下载:C语言难点分析整理.doc

    38. 右左法则- 复杂指针解析 189 39. 回车和换行的区别 192 40. 堆和堆栈的区别 194 41. 堆和堆栈的区别 198 42. 如何写出专业的C头文件 202 43. 打造最快的Hash表 207 44. 指针与数组学习笔记 222 45. 数组不是指针...

    超级有影响力霸气的Java面试题大全文档

     ArrayList 和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,...

    java面试题

    解析XML文档有哪几种方式? 14 28. JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么? 15 29. Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)...

    C语言难点分析整理.doc

    38. 右左法则- 复杂指针解析 189 39. 回车和换行的区别 192 40. 堆和堆栈的区别 194 41. 堆和堆栈的区别 198 42. 如何写出专业的C头文件 202 43. 打造最快的Hash表 207 44. 指针与数组学习笔记 222 45. 数组...

    java 面试题 总结

    ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector...

    高级C语言 C 语言编程要点

    38. 右左法则- 复杂指针解析 189 39. 回车和换行的区别 192 40. 堆和堆栈的区别 194 41. 堆和堆栈的区别 198 42. 如何写出专业的C头文件 202 43. 打造最快的Hash表 207 44. 指针与数组学习笔记 222 45. 数组不是指针...

Global site tag (gtag.js) - Google Analytics