Java程序 实现IdentityHashMap API
IdentityHashMap使用Hashtable实现了Map接口,在比较键(和值)的时候使用引用-平等来代替对象-平等。这个类不是一个通用的Map实现。虽然该类实现了Map接口,但它故意违反了Map的一般契约,该契约规定在比较对象时必须使用equals()方法。当用户需要通过引用来比较对象时,就会用到这个类。它属于java.util包。它后来在Java 1.4中被加入
在java中,IdentityHashMap和HashMap的主要区别在于,IdentityHashMap是Map接口的一个特殊实现,它不像其他Map的实现,例如HashMap,使用equals(obj)和hashCode()方法来比较对象。相反,IdentityHashMap使用平等运算符”==”来比较Java中的键和值,这使得它比HashMap更快,并且适合需要引用平等检查而不是逻辑平等的情况。
IdentityHashMap和HashMap的区别如下。
HashMap与IdentityHashMap的主要区别在于,IdentityHashMap使用平等运算符”==”来比较Map内部的键和值,而HashMap使用equals(obj)方法来比较键和值。
由于IdentityHashMap不使用equals(obj),对于具有昂贵的equals(obj)和hashCode()的对象,其速度相对来说比HashMap快。
3.HashMap和IdentityHashMap的另一个区别是键的不可变性。当我们在HashMap中存储对象时,安全的基本要求之一是键需要是不可变的,IdentityHashMap不要求键是不可变的,因为它不依赖equals(obj)和hashCode()。
示例 1:
输出
Implementation: HashMap使用hashCode()来查找桶的位置。IdentityHashMap不使用hashCode(),而是使用System.identityHashCode(object)。
示例 2:
输出
输出解释:
从输出结果可以看出,一旦编程语言的对象被改变,也就是HashMap和IdentityHashMap中的关键对象,在HashMap中我们无法检索到一个对象,但是当你使用IdentityHashMap时却能够检索到,因为前者使用equals()方法,一旦值被改变就返回错误,而后者使用”==”操作符,返回真实,因为在两种情况下对象在堆中是一样的。