转载请注明源出处:http://www.cnblogs.com/lighten/p/7381905.html

1.前言

  查看JDK源码总是能发现一些新东西,IdentityHashMap也是Map的一个子类,其也是一个有特性的Map。一样是通过Hash表的方法实现了Map接口,但是其比较键值是否相等的时候,并没有使用compare方法,而是使用是否是同一个引用来判断。所以k1和k2只有完全是同一个的时候才会相等k1==k2(通常是都不为null时k1.equals(k2)来判断)。

  该类的一个典型使用是拓扑保存对象图的转换(topology-preserving object graph transformations),例如序列化或者是深度拷贝。要进行这样一个转换,程序必须保存节点表来追踪所有的已经产生了的对象引用。节点表不能将不同的对象看成是一样的,哪怕其值相等。另一个典型的运用就是保存代理对象。例如,调试工具可能希望为正在调试的程序中的每个对象维护一个代理对象。

  IdentityHashMap同样允许空的键和值,但是不保证map中的顺序,尤其是不保证顺序会恒定不变。这个类有一个用于调优的参数--最大容量。这个参数用于确定最初包含哈希表的桶数。预期最大尺寸和桶数之间的精确关系未指定。map的大小超过预期值,桶的数量就会增加,这个过程的代价可能十分高,所以最好创建一个合适大小的map。但是另一方面,迭代器的性能与桶的数量成相关性,所以如果你关注迭代器的性能和内存使用,这个值不能设置的太大。

  注意此map是线程不安全的。迭代器是快速失败的,请注意,迭代器的故障快速行为不能得到保证,一般来说,在未同步并发修改的情况下不可能做出任何硬保证。该特性只能用于检测bug。这是一个简单的线性探测哈希表。

2.IdentityHashMap

  上图就是此map的一个基本数据结构了,就是一个数组hash表和一个size大小。默认大小32,实际初始化是2倍容量,如果自己传值x,其最终table大小是x<2n,等式成立时,最小的n时的2倍,具体看源代码。2倍大小是有原因的,和其结构有关,具体看下面。

  System.identityHashCode(x);这个方法看源码上的注释,意思是会返回默认的hashCode()方法的值,不管该类有没有覆写hashCode()方法。查了一下好像这个值的计算与其在内存中所处地址有关,不同的对象内存地址肯定不相同,所以这样可以满足IdentityHashMap的需求。上面返回的都是偶数。

  首先是处理了键为null的情况,然后算出hash值。循环判断,如果表中该位置与get的key是同一个,返回的是其后面的那个值。这里就可以看出实际的表为什么是容量的2倍了,因为其存储结构是key,value,key,value...。如果该位置为null,意味着表中没有该键,返回null。后面就是+2位进行查找了,这也就是此Hash表处理冲突的方法,并没有采取hashMap使用链表和树的方式,而是查找下面一个空位填入,这也就是为什么要弄成这种排列方式的原因。

  put方法也验证了这一点。先假定put的key存在,就找到它并替换。没有找到的时候,预判容量,如果3倍的预期数量大于2倍的现在的容量,就要扩表。否者就是放入其中。

  resize方法也较简单,不进行描述。其它的也只有remove方法了,remove方法要注意,由于put是有冲突的,所以其remove了一个函数后会检测后面是否由冲突导致的,会还原到其应该处在的位置。剩余的迭代器不进行描述。

3.图

Java之集合(十一)IdentityHashMap的更多相关文章

  1. Java中的集合(十一) 实现Map接口的TreeMap

    Java中的集合(十一) 实现Map接口的TreeMap 一.TreeMap简介(基于JDK1.8) TreeMap是基于红黑树数据结构,是一个key-value的有序集合,该映射根据其键的自然顺序进 ...

  2. 谈谈Java的集合组件

    让我们一起谈谈Java的集合组件 我们在使用Java的时候,都会遇到并使用到Java的集合.在这里通过自己的理解和网上的资源对Java的集合方面的使用做一个简单的讲解和总结. Java主要分为3个集合 ...

  3. 马凯军201771010116《面向对象与程序设计Java》第十一周学习总结

    一.理论知识部分 第九章  集合 1.数据结构介绍:线性结构:线性表,栈,队列,串,数组,文件.非线性结构:树,图. 散列表:又称为哈希表. 散列表算法的基本思想是:以结点的关键字为自变量,通过一定的 ...

  4. Java:集合,Map接口框架图

    Java集合大致可分为Set.List和Map三种体系,其中Set代表无序.不可重复的集合:List代表有序.重复的集合:而Map则代表具有映射关系的集合.Java 5之后,增加了Queue体系集合, ...

  5. 201671010140. 2016-2017-2 《Java程序设计》java学习第十一周

     java学习第十一周     本周,进行了java集合方面的知识,在博客园的帮助下,我的课前预习更有条理性,重点明确,本周的课堂反应明显更好了,首先,梳理一下本周知识点.  Collection   ...

  6. 对JAVA的集合的理解

    对JAVA的集合的理解是相对于数组 1.数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型) 2.JAVA集合可以存储和操作数目不固定的一组数据.  3.所有的JAVA集合都位 ...

  7. 【Java】集合_学习笔记

    一.集合 1.集合类也称容器类,主要负责保存.盛装其他数据. 2.集合可以保存数量不确定的数据,保存具有映射关系的数据(也称关联数组). 3.Java5后提供一些多线程安全的集合类,放在java.ut ...

  8. java的集合框架最全详解

    java的集合框架最全详解(图) 前言:数据结构对程序设计有着深远的影响,在面向过程的C语言中,数据库结构用struct来描述,而在面向对象的编程中,数据结构是用类来描述的,并且包含有对该数据结构操作 ...

  9. Java设计模式(十一) 享元模式

    原创文章,同步发自作者个人博客 http://www.jasongj.com/design_pattern/flyweight/.转载请注明出处 享元模式介绍 享元模式适用场景 面向对象技术可以很好的 ...

随机推荐

  1. UVa 11167 Monkeys in the Emei Mountain (最大流)

    题意:雪雪是一只猴子.它在每天的 2:00 —— 9:00之间非常渴,所以在这个期间它必须喝掉2个单位的水.它可以多次喝水,只要它喝水的总量是2.它从不多喝,在一小时内他只能喝一个单位的水.所以它喝水 ...

  2. 使用LVM对系统盘进行扩容

        不知道大家有没有碰到在安装CentOS时个,对系统每个挂载点分配多大容量比较合适的问题?如果挂载点容量分配大小,在某天不够用的时候怎么办:分配太大又存在浪费的情况.特别是在遇到系统盘特别小的时 ...

  3. springmvc 孔浩

    modelAttribute属性指定该form绑定的是哪个Model,当指定了对应的Model后就可以在form标签内部其 它表单标签上通过为path指定Model属性的名称来绑定Model中的数据了 ...

  4. .NET 4中的多线程编程之一:使用Task(转载)

    原文地址:http://www.cnblogs.com/yinzixin/archive/2011/11/04/2235233.html .NET 4为了简化多线程编程,提供了System.Threa ...

  5. Grafana展示DNS解析延时

      首先一个完整的监控肯定会包含三个部分:1.数据收集部分.2.数据存储部分.3.数据展示部分,今天我也是从这三个方面来实现这个监控的. 数据收集(SHELL 脚本)   没有想到比较好的方法来采集数 ...

  6. IllegalArgumentException: requirement failed: Corrupt index found

    今天突然接到客户反映线上服务器发送消息异常,登录服务器查看是kafka服务出现了问题,想重启一下服务,结果重启出现一下报错 [2017-06-30 19:29:13,708] FATAL Fatal ...

  7. App主导现在 HTML5领衔未来

    HTML5能够让开发人员构建丰富的基于Web应用程序,使其能在任何设备中使用标准的Web浏览器.很多人认为HTML5将会让App过时.到底App还是HTML5会是谁赢得最后的胜利,在业界也有不少讨论, ...

  8. dorado-menu

    1.menu控件是一个下拉菜单控件,可以设置数icon(图标),click事件,Dorado事件中都有self和arg两个参数,其中self是当前控件本身 2.menu控件可以和toolBar结合使用 ...

  9. C# 读取Excel,一波华丽的操作

    C# 读取Excel,其实有很多方法.但是今天要来一波华丽的操作. 先看效果: 以上这波操作使用了 ExcelDataReader 和 ExcelDataReader.DataSet 完成的. Exc ...

  10. ionic4 ios调试打包

    在ionic3的时候打包上架过ios的版本,等到今天,差不多一年左右过去.做了个ionic4的app要测试打包的时候,才发现以前的东西忘的差不多了.不得不从头再来一遍,所幸的是这次看见了很多好的文章, ...