xor-linked list のJava コードを書きたいと思っています。誰かが参照間で xor 操作を実行する方法を教えてもらえますか?
4 に答える
長いこと簡単に言うと、できません。
もう少し言いますと、Java で参照による変数の受け渡しが許可されている場合、これらの参照に対する算術演算は Java 言語では許可されません。したがって、xor 操作はできません。
さらに、ウィキペディアのエントリを読むと、次/前のノードを決定するために、そのポインター演算のみに依存する従来のリンクリスト実装のメモリ最適化であることを理解しています。私はこれを一種の非常に高度なメモリ最適化と考えています.C(++)などのアンマネージメモリ言語ほどJavaでは役に立たないようです.
できます...しかし、最初に言わなければなりません:やらないでください。
sun.misc.Unsafe
多くの安全でないことを許可するクラスがあります。これを使用すると、オブジェクトのアドレスを取得し、xor リンク リストを作成できます。しかし、繰り返しますが、やらないでください。少なくとも次の問題があります。
- JVM はリストを理解しないため、要素は GC によって食べられます。
- Unsafe は Oracle/Sun JRE の文書化されていない部分であるため、他の JRE では欠落している可能性があり、いつでも消える可能性があります。
- ポインターをいじるのはエラーが発生しやすい操作であるため、VM がクラッシュしたり、メモリ構造が破壊されて奇妙な結果が得られたりする可能性があります。
そして最後に:やらないでください。
リストをいじりたいだけなら、配列内に実装してください (ポインターの代わりにインデックスを使用してください)。これは安全で、うまくいきます。ただし、リンクされたリストは非常に非効率的な構造であり、ほとんどの場合使用できません。
いいえ、できません。Java には、オブジェクトのアドレスを取得するためのビルトインがありません。で実行できますがsun.misc.Unsafe
、そのクラスを使用するときに何をしているのかを知っておく必要があります。