我们可以在Java中实现一个异或链表吗?
Can we implement an XOR linked list in Java?
由于Java没有提供获取对象地址的方法,是否可以编写一个XOR linked list?
如果是,有人可以详细说明,怎么做吗?
我不相信你可以(至少,不为你的 "next" 和 "prev" 指针使用对象引用),因为你引用的原因:对象地址正式不透明。虽然我们可以访问引用的位,但 JVM 可以移动 内存中的对象(例如,在进行内存管理时),虽然我我没有立即找到它的规范引用,我相信它可以通过修改对象引用值来处理这个问题(字面意思是去更新每个字段等等旧引用所在的地方,给它新的引用)。因此,如果我们将对象引用转换为 long
(例如),然后将其与另一个转换为 long
的对象引用进行异或,如果任一对象移动(他们可以这样做),则一次其中的一些被异或并转换回对象引用,它可能不再有效。
因此,我认为您需要为指针使用对象引用以外的其他内容,例如对大量对象引用的索引,此时我相当确定您已经失去了内存优势异或链表的。
您永远无法在 Java 中执行此操作。
Even if 你使用 sun.misc.Unsafe
来访问对象的真实地址,而 even if 你使用一个不会四处移动对象的垃圾收集器(并发标记扫描不会移动对象,我相信,因为它是 "non-compacting"),你有一个更大的问题:通过破坏 prev
和 next
对象引用在一个整数中,垃圾收集器 不会意识到它们是对象引用 。所以它会认为引用的对象是未引用的,因此,会将您的所有列表节点作为垃圾收集。
如果需要节省内存,请使用基于数组的列表而不是链表。
由于Java没有提供获取对象地址的方法,是否可以编写一个XOR linked list?
如果是,有人可以详细说明,怎么做吗?
我不相信你可以(至少,不为你的 "next" 和 "prev" 指针使用对象引用),因为你引用的原因:对象地址正式不透明。虽然我们可以访问引用的位,但 JVM 可以移动 内存中的对象(例如,在进行内存管理时),虽然我我没有立即找到它的规范引用,我相信它可以通过修改对象引用值来处理这个问题(字面意思是去更新每个字段等等旧引用所在的地方,给它新的引用)。因此,如果我们将对象引用转换为 long
(例如),然后将其与另一个转换为 long
的对象引用进行异或,如果任一对象移动(他们可以这样做),则一次其中的一些被异或并转换回对象引用,它可能不再有效。
因此,我认为您需要为指针使用对象引用以外的其他内容,例如对大量对象引用的索引,此时我相当确定您已经失去了内存优势异或链表的。
您永远无法在 Java 中执行此操作。
Even if 你使用 sun.misc.Unsafe
来访问对象的真实地址,而 even if 你使用一个不会四处移动对象的垃圾收集器(并发标记扫描不会移动对象,我相信,因为它是 "non-compacting"),你有一个更大的问题:通过破坏 prev
和 next
对象引用在一个整数中,垃圾收集器 不会意识到它们是对象引用 。所以它会认为引用的对象是未引用的,因此,会将您的所有列表节点作为垃圾收集。
如果需要节省内存,请使用基于数组的列表而不是链表。