операция xor между ссылками java

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


person Jagan    schedule 28.01.2011    source источник
comment
Почему? Среда выполнения имеет множество реализаций списков — что вам нужно?   -  person Thorbjørn Ravn Andersen    schedule 28.01.2011
comment
Похоже, что цель XOR-связанного списка - одна и та же память. Если бы вы хотели сделать это, вы бы использовали ArrayList, который сэкономил бы еще больше памяти. (Хотя я сомневаюсь, что вам нужно беспокоиться об этом в любом случае)   -  person Peter Lawrey    schedule 28.01.2011


Ответы (4)


Короче говоря, вы не можете.

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

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

person Riduidel    schedule 28.01.2011
comment
Нет другой альтернативы для создания списка, связанного с xor, в java? - person Jagan; 28.01.2011
comment
Да. Используйте обычный двусвязный список; например как предусмотрено LinkedList. - person Stephen C; 28.01.2011

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

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

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

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


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

person maaartinus    schedule 28.01.2011
comment
Ого... +1 За упоминание Unsafe. я бы легко удвоил это (если бы это было возможно) с примером кода. - person Riduidel; 28.01.2011

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

person Gupta5610    schedule 10.07.2016

В Java невозможно выполнить операцию XOR между ссылочными узлами. XOR — побитовый логический оператор. Его можно использовать только для выполнения операций с двоичными цифрами/логическими значениями, и мы не можем преобразовать адреса памяти в java в целые числа.

person Lakshmi    schedule 13.07.2021