2011-01-28 22 views
9

Quiero escribir el código java para xor-linked list. ¿Puede alguien sugerirme cómo realizar la operación xor entre referencias?operación xor entre referencias java

+1

¿Por qué? El tiempo de ejecución tiene muchas implementaciones de listas: ¿qué es lo que necesita? –

+3

El propósito de XOR-linked-list parece ser la misma memoria. Si quisiera hacer eso, usaría una ArrayList que ahorraría aún más memoria. (Aunque dudo que deba preocuparse por eso) –

Respuesta

15

Para decir cosas largas cortas, no se puede.

Con solo un poco más de palabras, si Java le permite pasar variables por referencias, el lenguaje Java no permite la aritmética en estas referencias. Por lo tanto, sus operaciones xor no serán posibles.

Por otra parte, al leer la entrada wikiedpia, entiendo que es una optimización de la memoria de la implementación de la lista vinculada clásica, para determinar el nodo siguiente/anterior, únicamente sobre esa aritmética de puntero. Considero que es una especie de optimización de memoria muy avanzada, que no parece ser tan útil en Java como lo puede ser en lenguajes de memoria no administrados como, por ejemplo, C (++).

+0

¿No hay otra alternativa para crear una lista xor-linked en java? – Jagan

+4

Sí. Use una lista regular doblemente vinculada; p.ej. según lo provisto por 'LinkedList'. –

7

Puede ... pero debo decir primero: NO HAGALO.

Hay una clase sun.misc.Unsafe que permite hacer muchas cosas inseguras. Utilizándolo, puede obtener la dirección de los objetos y hacer una lista xor-linked. Pero nuevamente: NO LO HAGA. Existen al menos los siguientes problemas:

  • Como JVM no entiende su lista, los elementos son comidos por el GC.
  • Como Unsafe es una parte no documentada de Oracle/Sun JRE, puede faltar en otros JRE y puede desaparecer en cualquier momento.
  • Como tocar el violín con los punteros es una operación propensa a errores, puede bloquear su VM u obtener resultados extraños debido a la destrucción de las estructuras de la memoria.

Y finalmente: DO NOT DO IT.


Si lo que desea es jugar con la lista, poner en práctica dentro de una matriz (índices de uso en lugar de punteros). Esto es seguro y funcionará. Sin embargo, las listas vinculadas son estructuras bastante ineficientes, casi inutilizables la mayor parte del tiempo.

+2

Wow ... +1 Por la mención de 'Inseguro'. Me gustaría duplicarlo fácilmente (si fuera posible) con un ejemplo de código. – Riduidel

0

No, no puedes. Java no tiene un built-in para recuperar las direcciones de los objetos. Todavía se puede hacer con sun.misc.Unsafe, pero debe saber lo que está haciendo cuando usa esa clase.