2016-05-15 41 views
5

由于Java没有提供获取对象地址的方法,编码XOR linked list是否可行?我们可以在Java中实现XOR链表吗?

如果是的话,有人可以详细说明,该怎么做?

+0

任何事情都有可能。请澄清:我知道XOR是什么;我知道链表。什么是XOR链接列表?没有我知道的AND或NOT链接列表。 – duffymo

+0

@duffymo https://en.wikipedia.org/wiki/XOR_linked_list –

+0

找到它了:https://en.wikipedia.org/wiki/XOR_linked_list。从来没有听说过这样的事情。我敢打赌你可以用任何语言来实现它。 – duffymo

回答

1

你永远无法在Java中做到这一点。

即使您使用sun.misc.Unsafe以访问对象的真实地址,并即使您使用垃圾收集器不会左右移动的对象(并发标记扫不动的物体,我相信,因为它是“非压缩的”),你有一个更大的问题:通过将prevnext对象引用一起整数化,垃圾收集器不会意识到它们是对象引用。所以它会认为被引用的对象是未引用的,因此会将所有的列表节点收集为垃圾。

如果您需要保存内存,请使用基于数组的列表而不是链接列表。

3

因为你引用的理由,我不认为你可以(至少不要使用你的“下一个”和“前一个”指针的对象引用):对象地址是官方不透明的。虽然我们可能访问引用的位,JVM可以在内存中移动对象(例如,当进行内存管理时),虽然我没有立即找到它的规范引用,但我相信它可以处理通过修改对象引用值(逐字地去和更新每个字段,以及旧引用所在的位置,给它新的引用)。因此,如果我们将对象引用转换为long(例如),然后将另一个对象引用转换为long,如果其中一个对象移动(如同它们所能做的那样),一旦这些对象之一被XOR返回并且转换回对象引用,它可能不再有效。因此,我认为你需要为指针使用除对象引用之外的其他东西,例如索引到一个大对象引用数组中,在这一点上,我相当肯定你已经失去了内存中的好处。 XOR链接列表。

相关问题