Операция XOR между ссылками Java - PullRequest
9 голосов
/ 28 января 2011

Я хочу написать код Java для xor-связанного списка . Может кто-нибудь предложить мне, как выполнить операцию XOR между ссылками?

Ответы [ 3 ]

15 голосов
/ 28 января 2011

Говоря коротко, вы не можете .

С помощью всего лишь нескольких слов, если Java позволяет передавать переменные по ссылкам, арифметика по этим ссылкам не допускаетсяна языке Java.Следовательно, ваши операции xor будут невозможны.

Более того, когда я читаю запись в википедии, я понимаю, что это оптимизация памяти классической реализации связного списка, основанная, для определения следующего / предыдущего узла, исключительно на основе этой арифметики указателей.,Я считаю это разновидностью очень продвинутой оптимизации памяти, которая не кажется столь же полезной в Java, как это может быть в неуправляемых языках памяти, таких как, например, C (++).

8 голосов
/ 28 января 2011

Вы можете ... но я должен сначала сказать: НЕ ДЕЛАЙТЕ ЭТОГО .

Есть класс sun.misc.Unsafe, позволяющий делать много небезопасных вещей. С его помощью вы можете получить адрес объекта и составить список, связанный с xor. Но опять же: НЕ ДЕЛАЙТЕ ЭТОГО . Есть как минимум следующие проблемы:

  • Поскольку JVM не понимает ваш список, элементы съедаются GC.
  • Поскольку Unsafe является недокументированной частью Oracle / Sun JRE, она может отсутствовать в других JRE и может исчезнуть в любое время.
  • Поскольку манипулирование с указателями является подверженной ошибкам операцией, вы можете вызвать сбой вашей виртуальной машины или получить странный результат из-за разрушения структур памяти.

И наконец: НЕ ДЕЛАЙТЕ ЭТОГО .


Если вы просто хотите поиграть со списком, внедрите его в массив (используйте указатели вместо указателей). Это безопасно и будет работать. Однако связанные списки представляют собой довольно неэффективные структуры, которые в большинстве случаев близки к непригодным для использования.

0 голосов
/ 10 июля 2016

Нет, ты не можешь.Java не имеет встроенного для получения адресов объектов.Это все еще можно сделать с помощью sun.misc.Unsafe, но вы должны знать, что делаете при использовании этого класса.

...