Java 5中引入的IdentityHashMap的实际用途是什么?
答案 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)