2011-01-28 7 views
9

Chcę napisać kod Java dla xor-linked list. Czy ktoś może zasugerować mi, jak wykonać operację xor między referencjami?Operacja xor między odwołaniami java

+1

Dlaczego? Środowisko wykonawcze ma wiele implementacji list - czego potrzebujesz? –

+3

Celem listy dołączonej przez XOR wydaje się być ta sama pamięć. Jeśli chcesz to zrobić, użyjesz ArrayList, która zaoszczędzi jeszcze więcej pamięci. (Chociaż wątpię, abyś musiał się tym martwić). –

Odpowiedz

15

Krótko mówiąc, nie można.

Przy odrobinie większej ilości słów, jeśli Java pozwala przekazywać zmienne przez referencje, arytmetyczna w tych odniesieniach jest niedozwolona przez język Java. Dlatego twoje operacje xor nie będą możliwe.

Ponadto, czytając wpis wikiedpia, nie stosuję optymalizacji pamięci klasycznej implementacji listy linków, polegającej na określaniu następnego/poprzedniego węzła, wyłącznie na tej arytmetyki wskaźnika. Uważam to za bardzo zaawansowaną optymalizację pamięci, która nie wydaje się tak użyteczna w Javie, jak może być w niezarządzanych językach pamięciowych, jak na przykład C (++).

+0

Nie ma innej alternatywy, aby utworzyć listę powiązaną z Xor w java? – Jagan

+4

Tak. Użyj regularnej podwójnie połączonej listy; na przykład podaną przez 'LinkedList'. –

7

Możesz ... ale muszę najpierw powiedzieć: NIE ROBI TO.

Istnieje klasa sun.misc.Unsafe umożliwiająca wykonywanie wielu niebezpiecznych czynności. Za jego pomocą możesz uzyskać adres obiektów i utworzyć listę powiązaną z XOR. Ale znowu: NIE ZRÓB TO. Występują co najmniej następujące problemy:

  • Ponieważ JVM nie rozumie Twojej listy, żywioły zostają zjedzone przez GC.
  • Jako że Unsafe jest nieudokumentowaną częścią Oracle/Sun JRE, może nie być dostępna w innych środowiskach JRE i może zniknąć w dowolnym momencie.
  • Ponieważ manipulowanie wskaźnikami jest podatne na błędy, możesz zawiesić maszynę wirtualną lub uzyskać dziwny wynik z powodu zniszczenia struktur pamięci.

I na koniec: NIE ZRÓB TO.


Jeśli chcesz po prostu grać z listą, zaimplementuj ją wewnątrz tablicy (użyj indeksów zamiast wskaźników). To jest bezpieczne i będzie działało. Jednak połączone listy są dość nieefektywnymi strukturami, przez większość czasu nie nadającymi się do użytku.

+2

Wow ... +1 Za wzmiankę o "Niebezpiecznym". z łatwością podwoiłbym go (o ile to możliwe) za pomocą przykładu kodu. – Riduidel

0

Nie, nie możesz. Java nie ma wbudowanego narzędzia do pobierania adresów obiektów. Wciąż można to zrobić za pomocą sun.misc.Unsafe, ale powinieneś wiedzieć, co robisz podczas używania tej klasy.