2010-08-29 14 views
8

¿Cómo se comportan un TreeSet, HashSet o LinkedHashSet cuando los objetos son mutables? No me puedo imaginar que funcionarían en algún sentido?Colecciones de Java con objetos mutables

Si modifico un objeto después de haberlo agregado; ¿Cuál es el comportamiento de la lista?

¿Existe una mejor opción para tratar con una colección de objetos mutables (que necesito ordenar/indexar/etc.) que no sean una lista enlazada o una matriz y simplemente iterar a través de ellos cada vez?

Respuesta

4

La interfaz Set soluciona este problema directamente: "Nota: Tenga mucho cuidado si los objetos mutables se utilizan como elementos establecidos. El comportamiento de un conjunto no se especifica si el valor de un objeto se modifica de manera que afecte es igual a las comparaciones mientras que el objeto es un elemento en el conjunto. Un caso especial de esta prohibición es que no está permitido que un conjunto se contenga a sí mismo como un elemento ".

Adición:

¿Hay una mejor opción para tratar con una colección de objetos mutables?

Al intentar decidir qué implementación de la colección es la más adecuada, puede valer la pena mirar el core collection interfaces. Para las implementaciones Set en particular, siempre que se implementen correctamente equals() y hashCode(), los atributos no relacionados pueden ser mutables. Por analogía con una relación de base de datos, cualquier atributo puede cambiar, pero la clave primaria debe ser inviolable.

1

Ser mutable es solo un problema para la colección si el código hash de los objetos y el comportamiento de los métodos de comparación cambian después de que se inserta.

La forma en que podría manejar esto es eliminar los objetos de la colección y volverlos a agregar después de tal cambio para que el objeto.

En esencia, esto da como resultado un objeto inmutable desde el punto de vista de las colecciones.

Otra forma menos eficaz podría ser mantener un conjunto que contenga todos los objetos y crear un TreeSet/HashSet cuando necesite que el conjunto sea ordenado o indexado. Esta no es una solución real para una situación en la que los objetos cambian constantemente y usted necesita acceso al mapa al mismo tiempo.

0

La "mejor" forma de lidiar con esta situación es mantener las estructuras de datos auxiliares para la búsqueda, un poco como los índices en una base de datos. Entonces, todas sus modificaciones deben asegurarse de que los índices estén actualizados. Buenos ejemplos serían mapas o multimapas: antes de una actualización, elimine la entrada de cualquier índice y luego, después de una actualización, vuélvalos a agregar con los nuevos valores. Obviamente esto necesita atención con concurrencia, etc.

Cuestiones relacionadas