2016-05-15 3 views
5

Javaはオブジェクトのアドレスを取得する方法を提供していないので、XOR linked listをコード化することは可能ですか?JavaでXORリンクリストを実装できますか?

そうならば、誰かがそれを行う方法について、詳しく説明してくださいできますか?

+0

何でも可能です。明らかにしてください:私はXORとは何かを知っています。私はリンクリストを知っている。 XORリンクリストとは何ですか?私が気づいているリンクリストはありません。 – 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を使用しても場合、そしてあなたの周りのオブジェクトを移動しませんガベージコレクタを使用しでも場合

(並行マークスイープは、オブジェクトを移動しない、I整数で一緒にprevnextオブジェクト参照をマングリングすることで、ガベージコレクタは、彼らがオブジェクト参照があることを認識しません。それは「非圧縮」)だとして、あなたは大きな問題を抱えている、と信じています。したがって、参照されるオブジェクトは参照されないと考えられ、その結果、すべてのリストノードをガベージとして収集します。

あなたの代わりにリンクリストのアレイベースのリストを使用して、メモリを節約する必要がある場合。

3

私はあなたが引用の理由で、(少なくとも、あなたの「次」と「PREV」ポインタのオブジェクト参照を使用していない)ことができると信じていない:オブジェクトのアドレスが正式に不透明です。我々参照のビットにアクセスすることもできますが(メモリ管理を行う場合、例えば)、JVMはメモリにオブジェクトを移動させることができ、私はすぐにそれのためにスペックの引用を見つけていないよけれども、私はそれを処理するために許可されています信じていますそれはオブジェクトの参照値を変更すること(文字通り、すべてのフィールドを更新し、古い参照がある場合はそれを新しい参照とします)。私たちは(例えば)longへのオブジェクト参照を変換してから、別のオブジェクトを参照してlongに変換することをXOR演算た場合のいずれかのオブジェクトは、(彼らが行うことができますように)移動するのであれば、一度どちらかそれらのバックXORをとると、オブジェクト参照に変換された後は、もはや有効ではない可能性があります。

結果として、オブジェクト参照の大きな配列へのインデックスなど、ポインタのオブジェクト参照以外のものを使用する必要があると思います。その時点で、私はあなたがメモリの利益を失ったと確信していますXORリンクされたリスト

関連する問題