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
Odpowiedz
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 (++).
Nie ma innej alternatywy, aby utworzyć listę powiązaną z Xor w java? – Jagan
Tak. Użyj regularnej podwójnie połączonej listy; na przykład podaną przez 'LinkedList'. –
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.
Wow ... +1 Za wzmiankę o "Niebezpiecznym". z łatwością podwoiłbym go (o ile to możliwe) za pomocą przykładu kodu. – Riduidel
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.
Dlaczego? Środowisko wykonawcze ma wiele implementacji list - czego potrzebujesz? –
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ć). –