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/.转载请注明出处 享元模式介绍 享元模式适用场景 面向对象技术可以很好的 ...
随机推荐
- 经典的SQL语句面试题(转)
Student(S#,Sname,Sage,Ssex) 学生表Course(C#,Cname,T#) 课程表SC(S#,C#,score) 成绩表Teacher(T#,Tname) 教师表 问题:1. ...
- 浅谈webuploader上传文件
官网:http://c7.gg/fw4sn 案例: 文件上传进度 // 文件上传过程中创建进度条实时显示. uploader.on( 'uploadProgress', function( file, ...
- HDU1254 推箱子(BFS) 2016-07-24 14:24 86人阅读 评论(0) 收藏
推箱子 Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推 ...
- 评论:一套Developer Express控件包 For Delphi7
http://www.2ccc.com/idea.asp?articleid=1675 (也可以查看盒子上这个帖子的内容) Developer Express Inc 系列控件组 for Delphi ...
- Python学习-18.Python中的错误处理(三)
在某些情况下,我们需要定义自己的异常并且抛出 先定义一个错误: class MyError(BaseException): def __init__(self): pass 上面定义了一个叫MyErr ...
- El中调用java静态方法
最近在项目中遇到需要调用静态方法的问题,形如: <c:forEach items="beans" var="bean"> <p>总数:$ ...
- Get User CustomNotificationAddresses
select pv.StringValue, * from tbl_Identity i left join tbl_PropertyValue pv on pv.ArtifactId=conv ...
- 设计模式--Singleton_(1)(C#版)
今天我们来探索一下Singleton设计模式的实现及应用场景. Singleton模式属于Creational Type(创建型)设计模式的一种.该模式一般用于确保在应用中仅创建一个某类的instan ...
- CC2530学习路线-基础实验-串口通讯发送字符串(4 未完待续)
目录 1. 前期预备知识 1.1 串口通讯电路图 1.2 实验相关寄存器 1.2 常用波特率设置 本章未完待续..... 原来写的文章已经丢失了,只能找到这一小部分,看什么时候有时间再补上. 1. 前 ...
- C#扩展一个现有的类
做个记录,写个示例 using System; class Rubbish { public void Say() { Console.Write("Hello"); } } st ...