Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 6中IdentityHashMap的实际使用_Java - Fatal编程技术网

Java 6中IdentityHashMap的实际使用

Java 6中IdentityHashMap的实际使用,java,Java,可能重复: Java 5中引入的IdentityHashMap的实际用途是什么?看看:-) 此类的一个典型用途是拓扑保持对象图 转换,例如序列化或深度复制。表演 在这种转换中,程序必须维护一个“节点表” 跟踪已创建的所有对象引用 处理。节点表不能等同于不同的对象,即使 他们碰巧是平等的。这个类的另一个典型用法是 维护代理对象。例如,调试工具可能希望 为正在运行的程序中的每个对象维护代理对象 调试 附带说明:它从1.4版开始提供,而不是Java 5或6…序列化可变对象时,您希望跟踪已序列化的对象

可能重复:

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

看看:-)

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


附带说明:它从1.4版开始提供,而不是Java 5或6…

序列化可变对象时,您希望跟踪已序列化的对象及其引用id。您不能使用相等,因为您不能信任可变对象使用相等的标识检查,也不能更改。e、 日期是可变的,并且等于比较内容。

很少使用

用于向对象添加动态字段

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

当您想要将某些信息与对象关联时,这非常方便,因为对象设计器无法看到这些信息

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

WeakHashMap
更适合此目的;它也是一个身份映射,并且不会向对象添加额外的强引用。所以它更接近于动力场的概念

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


考虑
java.lang.ThreadLocal
,为线程添加动态字段;和
java.lang.ClassValue
,为类添加动态字段。它们不是严格必要的——我们可以通过并发弱映射实现同样的效果。它们的存在是出于性能原因。JDK可以“黑客”到线程/类中,添加支持以实现更快的查找。

我想这个问题以前有人问过。。。上面它指出,
WeakHashMap
“也是一个身份地图”。事实并非如此——事实上,在Java bugs DB中的bug中,他们承认它可能应该是一个,但事实并非如此。有关弱标识hashmap,请参阅Guava Maper类的javadoc(关于
new MapMaker().weakKeys().makeMap()
),我建议您编辑答案以修复Hawkins评论中显示的缺陷。