Hashmap的实现原理

  默认它是存放了16个链表头的数组,存储数据的时候key先生成hashcode,根据hashcode把数据存放到相应链表中,那么是如何确定存放到哪个链表中的呢?采用hashcode%len(len是数组长度)。注意这个模数据取余,余数相同的放在同一个桶中的思想用在很多地方。然后hashmap有个静态内部类entry,可以说是hashmap存储数据的基础bean,属性包括key、value、next等,多个entry组成一个链表,有个数组table[],其中存储各个链表的初始节点,这就是hashMap的实现原型,最开始这个数组的长度就是16。

Hashmap存数据

  通过key得到hashcode,hashcode对数组table[]长度取余放到相应的链表中。注意,新的键值对将放在链表的头部,放入同一个桶中的新的entry的next将会指向之前的链表头部的entry。为什么不放到尾部呢?很简单,对于一个有长度的链表,当有一个新的entry到来的时候,放到链表的尾部是需要从头部一直找到尾部的,有消耗无收益。

HashMap取数据

  取数据的时候是根据hashcode取模直接在table[]中找到相应的链表,然后遍历链表取到value。

一定要注意的

  一致性:在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数。

  我们知道Map的key在存取数据时候,key需要经历两个过程:1、hashcode取模找链表。2、遍历链表中的entry并与entry的key进行equal比较,来寻找目标value。那么hashcode和equal方法就起了非常重要的作用。

  这里分两个情况来说:

  1、key为基础数据类型或常用的对象(如String)。这时候值相同的key一定是相同的hashcode,并且equal进行比较的时候,比较的就是值,那么这种情况下HashMap正常使用。

  2、key为对象。Object中的equal只是简单的判断是不是同一个实例,比较的是两个对象之间的内存地址是否相同;Object的hashcode方法为默认的内存地址。而很多时候我们使用Map要求的key是逻辑上相同即可而不是要求一定要同一个对象,这就意味着相同值的不同对象会有不同的内存地址。那么使用Map存取的时候,<A对象,value>存入Map,此时B对象和A对象逻辑相等,我们希望拿B对象也能取出value,但是B对象和A对象不是同一对象,于是在hashcode过程中,不同的hashcode值导致去不到目标链表,取值为null;即使假设hashcode值不同但是取模之后也到了目标链表中(几率小),进行key的equal比较时,由于是不同对象,B依然无法取到value,取值为null。所以key为对象的情况下,我们需要重写hashcode方法和equal方法,达成逻辑相同则hashcode相同、equal比较也相同。也应该明白,String也为对象,但是hashcode和equals方法官方已经帮我们重写过了,所以可以直接用,而使用其他对象作为key的时候,这个过程就需要我们自己来完成。

HashMap的理解的更多相关文章

  1. 关于hashmap的理解

    首先分析第一个比较重要的方法 put 方法,源码如下 public V put(K key, V value) { if (key == null) return putForNullKey(valu ...

  2. 关于java集合类HashMap的理解

    一.HashMap概述 HashMap基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.(除了不同步和允许使用 null 之外,HashMap  ...

  3. 对HashMap的理解(三):ConcurrentHashMap

    HashMap不是线程安全的.在并发插入元素的时候,有可能出现环链表,让下一次读操作出现死循环.避免HashMap的线程安全问题有很多方法,比如改用HashTable或Collections.sync ...

  4. 【大厂面试08期】谈一谈你对HashMap的理解?

    摘要 HashMap的原理也是大厂面试中经常会涉及的问题,同时也是工作中常用到的Java容器,本文主要通过对以下问题进行分析讲解,来帮助大家理解HashMap的原理. 1.HashMap添加一个键值对 ...

  5. hashMap 深入理解

    1.java 的hashMap 是通过 链地址 法来解决 hash冲突的 2.初始时是一个empty table, 第一次添加数据时检查到时空数组就会 生成指定容量的数组,也就是 在第一次使用时才初始 ...

  6. HashMap简单理解

    1. hashmap基于哈希表的map接口实现,此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable ...

  7. (惊艳)hashmap的理解(映射)

    第一: hashmap在内存中是长这样的,数组+链表的形式 // HashMap采用链表法解决冲突,每一个Entry本质上是一个单向链表 transient Entry[] table; 第二:  p ...

  8. 对HashMap的理解(一):HashMap的实现

    一.HashMap介绍 1. 定义HashMap实现了Map接口,继承AbstractMap类.其中Map接口定义了键映射到值的规则,而AbstractMap类提供 Map 接口的骨干实现,以最大限度 ...

  9. 对HashMap的理解(二):高并发下的HashMap

    在分析hashmap高并发场景之前,我们要先搞清楚ReHash这个概念.ReHash是HashMap在扩容时的一个步骤.HashMap的容量是有限的.当经过多次元素插入,使得HashMap达到一定饱和 ...

  10. 对java中hashmap深入理解

    1.HashMap的结构是怎样的? 二维结构,第一维是数组,第二维是链表 2.Get方法的流程是怎样的? 先调用Key的hashcode方法拿到对象的hash值,然后用hash值对第一维数组的长度进行 ...

随机推荐

  1. 《方法总结》C路的方法发现

    C语言方法荟萃 定义一个最大值和最小值:#define max(x,y)  ( x>y?x:y ) #define min(x,y)  ( x<y?x:y ) &&: 说得 ...

  2. 跨平台框架与React Native基础

    跨平台框架 什么是跨平台框架? 这里的多个平台一般是指 iOS 和 Android . 为什么需要跨平台框架? 目前,移动开发技术主要分为原生开发和跨平台开发两种.其中,原生应用是指在某个特定的移动平 ...

  3. 当try、catch中有return时,finally中的代码会执行么?

    今天,看到一个面试题: try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗? 我们用代码来验证下: public static void mai ...

  4. JDK13环境变量配置

    第一步:下载JDK(开发工具包) JDK分为OracleJDK和OpenJDK下面简要说明 OracleJDK 部分代码闭源.商业收费 OpenJDK 开放源码.商业免费 两者大部分代码是共用的(除闭 ...

  5. springcloud一些博文记录

    自己搭建完整demo后看的一个系列博文https://my.oschina.net/u/3375733/following 现在看着这个系列的后期文章估计出差前不会看了 一个博主的系列的git地址和博 ...

  6. Linux初步了解

    文件系统类型:swap分区:用于内存扩充,用磁盘兑换,磁盘是内存的两倍,便于替换 / 分区:容纳根文件系统 文件名:由字母,数字,下划线,圆点组成 文件类型:显示在每一行的左边第一个字符 普通文件   ...

  7. pandas 使用技巧

    多列展示 查看DataFrame时,列数较多会省略中间列的信息,可以设置最大展示列数,代码如下: 1 import pandas as pd 2 pd.set_option('display.max_ ...

  8. MMC & SD 发展历史

    一.概述 MMC 卡和 SD 卡都是基于 Nand Flash 技术的移动存储卡. MMC(MultiMediaCard) 卡于 1997 年由西门子和 Sandisk 推出,SD (Secure D ...

  9. Git入门教程,详解Git文件的四大状态

    大家好,欢迎来到周一git专题. git clone 在上一篇文章当中我们聊了怎么在github当中创建一个属于自己的项目(repository),简称repo.除了建立自己的repo之外,我们更多的 ...

  10. training set, validation set, test set的区别

    training set: 用来训练模型 validation set : 用来做model selection test set : 用来评估所选出来的model的实际性能 我们知道,在做模型训练之 ...