2011-01-28 3 views
9

Voglio scrivere il codice java per xor-linked list. Qualcuno mi può suggerire come eseguire l'operazione xor tra i riferimenti?xo operazione tra i riferimenti java

+1

Perché? Il runtime ha molte implementazioni di elenchi: di cosa hai bisogno? –

+3

Lo scopo dell'elenco XOR-linked sembra essere nella stessa memoria. Se si volesse farlo, si userebbe un ArrayList che salverebbe ancora più memoria. (Anche se dubito che sia necessario preoccupartene in entrambi i casi) –

risposta

15

Per dire cose lunghe, non è possibile.

Con poche parole in più, se Java consente di passare variabili per riferimento, l'aritmetica su questi riferimenti non è consentita dal linguaggio Java. Quindi, le tue operazioni xor non saranno possibili.

Inoltre, durante la lettura della voce wikiedpia, capisco che si tratta di un'ottimizzazione della memoria della classica implementazione delle liste collegate che si basa, per determinare il nodo prossimo/precedente, esclusivamente su quell'aritmetica puntatore. Lo considero un sistema di ottimizzazione della memoria molto avanzato, che non sembra utile in Java come può essere nei linguaggi di memoria non gestiti come, per esempio, C (++).

+0

Non c'è altra alternativa per creare un elenco xor-linked in java? – Jagan

+4

Sì. Usa una lista regolare doppiamente collegata; per esempio. come fornito da 'LinkedList'. –

7

È possibile ... ma devo dire prima: NON FARE IT.

C'è una classe sun.misc.Unsafe che consente di fare un sacco di cose non sicure. Usandolo è possibile ottenere l'indirizzo degli oggetti e creare liste xor-linked. Ma ancora: NON FARLO. Ci sono almeno i seguenti problemi:

  • Poiché JVM non capisce la tua lista, gli elementi vengono mangiati dal GC.
  • Poiché Unsafe è una parte non documentata di Oracle/Sun JRE, potrebbe mancare in altri JRE e potrebbe scomparire in qualsiasi momento.
  • Come manipolare i puntatori è un'operazione soggetta a errori, è possibile che si verifichi un arresto anomalo della macchina virtuale o si ottenga uno strano risultato a causa della distruzione delle strutture di memoria.

E infine: NON FARE.


Se si desidera giocare con l'elenco, implementarlo all'interno di un array (utilizzare gli indici anziché i puntatori). Questo è sicuro e funzionerà. Tuttavia, le liste concatenate sono strutture abbastanza inefficienti, quasi inutilizzabili per la maggior parte del tempo.

+2

Wow ... +1 per la menzione di "non sicuro". Vorrei facilmente raddoppiarlo (se fosse possibile) con un esempio di codice. – Riduidel

0

No, non è possibile. Java non ha un built-in per il recupero degli indirizzi degli oggetti. Può essere ancora fatto con sun.misc.Unsafe, ma dovresti sapere cosa stai facendo quando usi quella classe.