2016-05-15 98 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鏈接列表。

相關問題