Можем ли мы реализовать связанный список XOR в Java?

Поскольку Java не предоставляет способа получить адрес объекта, возможно ли закодировать связанный список XOR ?

Если да, то может кто-нибудь уточнить, как это сделать?


person priyas    schedule 15.05.2016    source источник
comment
Все возможно. Пожалуйста, уточните: я знаю, что такое XOR; Я знаю связанные списки. Что такое связанный список XOR? Я не знаю связанного списка AND или NOT.   -  person duffymo    schedule 15.05.2016
comment
@duffymo en.wikipedia.org/wiki/XOR_linked_list   -  person Sleiman Jneidi    schedule 15.05.2016
comment
Нашел: en.wikipedia.org/wiki/XOR_linked_list. Никогда не слышал о таком. Бьюсь об заклад, вы можете реализовать это на любом языке.   -  person duffymo    schedule 15.05.2016
comment
В Java 7 вы можете использовать сжатые ссылки   -  person Sleiman Jneidi    schedule 15.05.2016
comment
См. stackoverflow.com/questions/4826626/ также.   -  person Kedar Mhaswade    schedule 15.05.2016


Ответы (2)


Вы никогда не сможете сделать это в Java.

Даже если вы используете sun.misc.Unsafe, чтобы получить доступ к реальным адресам объектов, и даже если вы используете сборщик мусора, который не будет перемещать объекты (Concurrent Mark Sweep не не перемещайте объекты, я полагаю, поскольку это «несжатие»), у вас есть более серьезная проблема: искажая ссылки на объекты prev и next вместе в целое число, сборщик мусора не поймет, что они являются объектами ссылки. Таким образом, он будет думать, что указанные объекты не имеют ссылок, и, следовательно, соберет все узлы вашего списка как мусор.

Если вам нужно сэкономить память, используйте список на основе массива вместо связанного списка.

person Boann    schedule 15.05.2016

Я не верю, что вы можете (по крайней мере, не используя ссылки на объекты для ваших указателей «следующий» и «предыдущий») по причине, которую вы цитируете: адреса объектов официально непрозрачны. Хотя мы могли получить доступ к битам ссылки, JVM может перемещать объекты в памяти (например, при управлении памятью), и хотя я не сразу нахожу спецификацию цитата для него, я считаю, что это разрешено обрабатывать, изменяя значения ссылки на объект (буквально переходя и обновляя каждое поле и т. д., где находится старая ссылка, давая ему новую ссылку). Итак, если мы преобразовали ссылку на объект в long (например), а затем выполнили XOR с другой ссылкой на объект, преобразованной в long, если какой-либо объект перемещается (как они могут это сделать), как только любой из них будет XOR обратно и преобразована обратно в ссылку на объект, она может оказаться недействительной.

Следовательно, я думаю, вам нужно будет использовать что-то другое, кроме ссылок на объекты для указателей, таких как индексы в большой массив ссылок на объекты, и в этот момент я вполне уверен, что вы потеряли преимущество памяти связанного списка XOR .

person T.J. Crowder    schedule 15.05.2016