转载请注明源出处: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. PRId64的正确用法

    #include <inttypes.h> #include <stdint.h> #include <stdio.h> // g++ -g -o x x.cpp ...

  2. 75. Sort Colors(颜色排序) from LeetCode

      75. Sort Colors   给定一个具有红色,白色或蓝色的n个对象的数组,将它们就地 排序,使相同颜色的对象相邻,颜色顺序为红色,白色和蓝色. 这里,我们将使用整数0,1和2分别表示红色, ...

  3. mysql insert 事务相关(草稿)

    当 insert 多条语句时初步试了一下是自带事务机制的,如在一个这样的表中: 执行语句 INSERT INTO `t_mytest`(`id`) VALUES (1),(2),(3),(4),(5) ...

  4. [C#]SharpSSH-一个可以使用SSH连接的.NET库

    A Secure Shell (SSH) library for .NET 觉得有用,就记录下来了 http://www.tamirgal.com/blog/page/SharpSSH.aspx ht ...

  5. 一起学习MVC(4)Controllers的学习

                控制器Controllers Controllers为控制器文档,AccountControllers内的方法对应View→Account下的cshtml文件. 我们看到Aco ...

  6. Ajax异步请求阻塞情况的解决办法

    最近使用ExtJs4的mvc模式在开发了在线漫画的后台,因为异步请求比较多,有的回应时间长,有点短.我发现在多次并发的情况下,会造成阻塞的情况.也就是说如果回应时间长的请求还在进行中,短的请求却被挂起 ...

  7. WebAPI+Html跨域时对session的支持

    1.Global.asax中添加对Session的支持,重新Init方法: public override void Init() { this.PostAuthenticateRequest += ...

  8. BitAdminCore框架应用篇:(四)核心套件querySuite按钮功能

    索引 NET Core应用框架之BitAdminCore框架应用篇系列 框架演示:http://bit.bitdao.cn 框架源码:https://github.com/chenyinxin/coo ...

  9. fast powf

    测试结果: sum (fast) in clock 1562sum (fast2) in clock 1407sum (fast3) in clock 3156sum in clock 7797Err ...

  10. 深入浅出“跨视图粒度计算”--3、EXCLUDE表达式

    本文由  网易云发布. 深入嵌入“跨视图粒度计算”的前面两篇分别讲了 1.理解数据的粒度 2.INCLUDE表达式 这一篇讲一下EXCLUDE表达式的用法. EXCLUDE,中文译为“排除”,顾名思义 ...