应该有很多人不知道IdentityHashMap的存在,包括作者本人,也从来没有在日常工作中使用过它。
实际上IdentityHashMap是Jdk自带的集合类,可以在一些特定的场景下使用。
相比HashMap而言,IdentityHashMap的结构更简单,更容易维护。
本文将从以下几个方面讲解:
1. Java中与Hash相关的操作
2. IdentityHashMap使用举例
3. IdentityHashMap和HashMap对比
4. IdentityHashMap源码分析
5. IdentityHashMap使用场景
1、Java中与Hash相关的操作
A.等于(==)操作
JAVA中的==操作符是来判断两个对象是否是同一个对象,返回结果通过下面三条规则进行确定:
1.对于两个空对象x == null并且y == null,则x == y返回true;
2.对于两个非空对象x,y,当且仅当x和y引用同一对象时,x == y才返回true;
3.对于空对象x和非空对象y,或者非空对象x和空对象y,x == y都返回false。
==操作强调的是,两个对象是否引用同一对象,更通俗的说,引用的对象在堆内存中地址是否相同。
B.equals比较
equals方法用来判断其他对象是否“等于”此对象,注意这里的等于是加了引号的,以区别上面讲解的”==”。equals强调的是逻辑上的相等,不要求比较的两个对象必须是同一对象,equals方法的实现要必须要满足以下几个特性:
1.自反性
对于任何非空的引用对象x,x.equals(x)应该返回true;
2.对称性
对于任何非空的引用对象x和y,当且仅当y.equals(x)返回true时,x.equals(y)才能返回true;
3.传递性
对于任何非空引用对象x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也必须返回true;
4.一致性
对于任何非空的引用对象x和y,在equals中比较的字段没有被修改的前提下,任意多次调用x.equals(y)始终返回true或false;
5.null值处理
对于任何非空引用值x,x.equals(null)应返回false。
需要注意,当重写了hashCode方法时,通常都需要重写equals方法,以维护hashCode的约定:x.equa