Java引用之间的异或操作

10

我想为异或链表编写Java代码。有人能建议我如何在引用之间执行异或操作吗?


1
为什么?运行时有很多列表实现 - 你需要什么? - Thorbjørn Ravn Andersen
3
XOR链表的目的似乎是为了节省内存。如果您想要这样做,可以使用ArrayList,这将节省更多的内存。(虽然我怀疑您无论如何都不必担心内存问题) - Peter Lawrey
4个回答

15

简而言之,你不能

稍微多说一点,如果Java允许您通过引用传递变量,则Java语言不允许对这些引用进行算术运算。因此,您的异或操作将无法实现。

此外,在阅读维基百科条目时,我了解到它是传统链表实现的内存优化,仅依靠指针算术来确定下一个/上一个节点。我认为这是一种非常先进的内存优化,在像Java这样的受管内存语言中似乎并不像在非托管内存语言(例如C(++))中那样有用。


在Java中创建XOR链接列表没有其他选择吗? - Jagan
4
可以使用普通的双向链表来实现,例如使用Java中提供的LinkedList - Stephen C

10

您可以使用一个名为sun.misc.Unsafe的类来执行很多不安全的操作,但我必须首先说:请勿这样做

它可以让您获取对象的地址并创建异或链接列表。 但是,请再次注意:请勿这样做。以下至少存在以下问题:

  • 由于JVM无法理解您的列表,元素会被垃圾回收机制吞噬。
  • 由于Unsafe是Oracle / Sun JRE的未经记录的部分,可能在其他JRE中缺失,并且随时可能消失。
  • 由于调整指针是容易出错的操作,因此可能会导致VM崩溃或者由于破坏内存结构而得到奇怪的结果。

最后:请勿这样做


如果你只是想玩一下列表,那么请在数组内部实现它(使用索引代替指针)。 这是安全的并且有效。 但是,链表是非常低效的数据结构,大多数情况下几乎无法使用。


2
哇...提到“Unsafe”我就点赞了。如果有可能,我会很容易地用代码示例将其加倍。 - Riduidel

0
不行。Java没有内置获取对象地址的功能。可以使用sun.misc.Unsafe实现,但在使用该类时应该知道自己在做什么。

0

在Java中,不可能对引用节点执行异或(XOR)操作。XOR是一种位逻辑运算符。它只能用于对二进制数字/布尔值执行操作,我们不能将Java中的内存地址强制转换为整数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接