由于Java没有提供获取对象地址的方法,编码XOR linked list是否可行?
如果是,有人可以详细说明,怎么做?
答案 0 :(得分:3)
我不相信你可以(至少,不使用对象引用用于你的" next"和#34; prev"指针),因为你引用的原因:对象地址官方不透明。虽然我们可以访问引用的位,但是JVM可以移动内存中的对象(例如,在进行内存管理时),虽然我没有立即查找对它的规范引用,我相信它可以通过修改对象引用值来处理它(逐字地去和更新每个字段以及旧引用所在的位置,给它新的引用)。因此,如果我们将对象引用转换为long
(例如),然后将另一个对象引用转换为long
,那么,如果任一个对象移动(就像它们可以做的那样),如果其中任何一个被异或后退并转换回对象引用,它可能不再有效。
因此,我认为您需要为指针使用除对象引用之外的其他内容,例如索引到大量对象引用中,此时我相当确定您已经确定了失去了XOR链表的记忆效益。
答案 1 :(得分:1)
你永远不能用Java做到这一点。
即使您使用sun.misc.Unsafe
来访问对象的真实地址,即使也使用了垃圾收集器来赢得' t移动物体(并发Mark Sweep不移动物体,我相信,因为它"非压缩"),你有一个更大的问题:通过修改{{1} }和prev
对象以整数形式一起引用,垃圾收集器不会意识到它们是对象引用。因此,它会认为引用的对象是未引用的,因此会将所有列表节点收集为垃圾。
如果需要保存内存,请使用基于数组的列表而不是链表。