Java之集合(十一)IdentityHashMap
转载请注明源出处: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的更多相关文章
- Java中的集合(十一) 实现Map接口的TreeMap
Java中的集合(十一) 实现Map接口的TreeMap 一.TreeMap简介(基于JDK1.8) TreeMap是基于红黑树数据结构,是一个key-value的有序集合,该映射根据其键的自然顺序进 ...
- 谈谈Java的集合组件
让我们一起谈谈Java的集合组件 我们在使用Java的时候,都会遇到并使用到Java的集合.在这里通过自己的理解和网上的资源对Java的集合方面的使用做一个简单的讲解和总结. Java主要分为3个集合 ...
- 马凯军201771010116《面向对象与程序设计Java》第十一周学习总结
一.理论知识部分 第九章 集合 1.数据结构介绍:线性结构:线性表,栈,队列,串,数组,文件.非线性结构:树,图. 散列表:又称为哈希表. 散列表算法的基本思想是:以结点的关键字为自变量,通过一定的 ...
- Java:集合,Map接口框架图
Java集合大致可分为Set.List和Map三种体系,其中Set代表无序.不可重复的集合:List代表有序.重复的集合:而Map则代表具有映射关系的集合.Java 5之后,增加了Queue体系集合, ...
- 201671010140. 2016-2017-2 《Java程序设计》java学习第十一周
java学习第十一周 本周,进行了java集合方面的知识,在博客园的帮助下,我的课前预习更有条理性,重点明确,本周的课堂反应明显更好了,首先,梳理一下本周知识点. Collection ...
- 对JAVA的集合的理解
对JAVA的集合的理解是相对于数组 1.数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型) 2.JAVA集合可以存储和操作数目不固定的一组数据. 3.所有的JAVA集合都位 ...
- 【Java】集合_学习笔记
一.集合 1.集合类也称容器类,主要负责保存.盛装其他数据. 2.集合可以保存数量不确定的数据,保存具有映射关系的数据(也称关联数组). 3.Java5后提供一些多线程安全的集合类,放在java.ut ...
- java的集合框架最全详解
java的集合框架最全详解(图) 前言:数据结构对程序设计有着深远的影响,在面向过程的C语言中,数据库结构用struct来描述,而在面向对象的编程中,数据结构是用类来描述的,并且包含有对该数据结构操作 ...
- Java设计模式(十一) 享元模式
原创文章,同步发自作者个人博客 http://www.jasongj.com/design_pattern/flyweight/.转载请注明出处 享元模式介绍 享元模式适用场景 面向对象技术可以很好的 ...
随机推荐
- 使用async-http-client实现异步批量http请求
最近项目中需要在微服务中调用rest接口,而且需要调用得次数很多,所以同步得http客户端已经不满足要求,在网上查阅资料后发现了async-http-client这个包得性能不错,所以写了个demo测 ...
- Spring 集成 MemCache
1)xml <bean class="com.danga.MemCached.SockIOPool" factory-method="getInstance&quo ...
- python logging 实现的进程安全的文件回滚日志类
python标准库中的logging模块在记录日志时经常会用到,但在实际使用发现它自带的用于本地日志回滚的类 logging.handlers.RotatingFileHandler 在多进程环境下会 ...
- Reactor 模式在Netty中的应用
Reactor 模式在Netty中的应用 典型的Rector模式 mainReactor 服务端创建成功后,会监听Accept操作,其中ServerSocketchannel中的PipeLine中现在 ...
- Codeforces758A Holiday Of Equality 2017-01-20 10:08 48人阅读 评论(0) 收藏
A. Holiday Of Equality time limit per test 1 second memory limit per test 256 megabytes input standa ...
- Bezier曲线
1. 学习网址 http://give.zju.edu.cn/cgcourse/new/book/8.2.htm
- [LeetCode 总结帖]: 链表专题
链表在笔试面试中都是出镜率极高的一种数据结构. 由于链表具有结构简单,代码量较少,变化多,可以较为全面的考察应聘者的逻辑思考能力以及应变能力的特点,而备受面试官青睐. 在本节中,我将Leetcode中 ...
- 基于Quartz.net的远程任务管理系统 一
在上一篇绪中,已经介绍了整个项目的情况下了,接下来就是开始一步步做起来了. 首先:先整个我们的Job任务表,以及Job执行日志表.SQL如下: drop table if exists job_inf ...
- ionic4 ios调试打包
在ionic3的时候打包上架过ios的版本,等到今天,差不多一年左右过去.做了个ionic4的app要测试打包的时候,才发现以前的东西忘的差不多了.不得不从头再来一遍,所幸的是这次看见了很多好的文章, ...
- 统一登录中心SSO 单点登录系统的构想
什么是单点登录?我想肯定有一部分人“望文生义”的认为单点登录就是一个用户只能在一处登录,其实这是错误的理解.单点登录指的是多个子系统只需要登录一个,其他系统不需要登录了(一个浏览器内).一个子系统退出 ...