在Java 6中实际使用IdentityHashMap

时间:2011-12-29 12:27:12

标签: java

  

可能重复:
  Use cases for IdentityHashMap

Java 5中引入的IdentityHashMap的实际用途是什么?

4 个答案:

答案 0 :(得分:8)

查看Java Docs: - )

  

此类的典型用法是拓扑保留对象图   转换,例如序列化或深度复制。去表演   这样的转换,一个程序必须保持一个“节点表”   跟踪已经存在的所有对象引用   处理。即使,节点表也不能等同于不同的对象   他们碰巧是平等的。这个类的另一个典型用途是   维护代理对象。例如,调试工具可能希望   维护程序中每个对象的代理对象   调试。

旁注:它从版本1.4开始可用,而不是Java 5或6 ......

答案 1 :(得分:4)

用于向对象添加动态字段。

某些语言直接支持动态字段:任何人都可以随时向任何对象添加任何字段。

当您想要将某些信息与对象相关联时,这很方便,对象设计者无法做到这一点。

Java没有真正的动态字段。我们可以通过使用身份映射将对象与某种信息相关联来模拟它。

WeakHashMap更适合此目的;它也是一个身份地图,它不会为该对象添加额外的强引用。所以它更接近动态场概念。

并发是剩下的问题。如果两个线程访问两个不同对象的相同动态字段,则两个线程之间不应存在依赖关系。我们可以通过某种并发的弱hashmap来解决它。然而,与普通现场访问相比,性能并不理想。

考虑java.lang.ThreadLocal,向线程添加动态字段;和java.lang.ClassValue,为类添加动态字段。它们并非绝对必要 - 我们可以通过并发弱映射实现相同的功能。它们存在是出于性能原因。 JDK可以“入侵”Thread / Class以添加支持以实现更快的查找。

答案 2 :(得分:2)

在序列化可变对象时,您需要跟踪已序列化的对象及其引用ID。您不能使用相等,因为您不能相信可变对象对等号使用身份检查而不能更改。例如日期是可变的,等于比较内容。

答案 3 :(得分:0)