2009-06-23 15 views
6

En mi código prefiero usar ArrayList para todas las listas, HashMap para todos los mapas, HashSet para todos los conjuntos.Implementaciones de colecciones de Java (por ejemplo, HashMaps vs HashSet vs HashTable ...), ¿cuál es el costo de elegir el incorrecto?

Desde un punto de vista práctico, ¿cuánto estoy perdiendo en flexibilidad, escalabilidad, legibilidad y rendimiento al elegir la implementación incorrecta? ¿Cuándo tiene sentido pasar tiempo para decidir usar uno en lugar de otro?

Ciertamente, veo un caso muy claro de por qué alguien usaría una LinkedList en lugar de una ArrayList dadas ciertas circunstancias. ¿Cuándo alguien siente que es fundamental que use un HashMap en lugar de un TreeMap o un HashTable? ¿Qué hay de los Sets?

Preguntas:

  1. ¿Cuál es el costo de la elección de mal?
  2. ¿Alguien tiene historias de desastres sobre elegir la implementación incorrecta y el centro de datos se está incendiando?
  3. ¿Alguna buena regla general?
  4. ¿Hay implementaciones de colecciones desconocidas sin las que no pueda vivir?

He leído a través de:

encontré this pregunta a relacionarse desde un punto teórico de ver, pero estoy más interesado en un mundo real, en el t renquea respuesta.

+0

Esto es realmente como 4 preguntas en una y realmente más de una discusión no una pregunta – cletus

+0

Respuesta probablemente relacionada: http://bit.ly/1NSlx – OscarRyz

+0

sin acortamiento de URL http://stackoverflow.com/questions/532521/ which-data-structure-uses-more-memory/532569 # 532569 –

Respuesta

7

Esta es una pregunta muy general, pero agregaré un par de veces.

Si está orientado a la programación de interfaces, entonces la flexibilidad no tendrá un gran éxito. Por ejemplo

void foo(List<E> list); 

El costo de la elección poco se podía ver en penalizaciones de rendimiento. Por ejemplo, elegir una LinkedList cuando el acceso directo (como en ArrayList) es lo que está buscando.

Los conjuntos tienen un problema similar. Si desea mantener las colecciones ordenadas sin duplicados, SortedSet sería una opción más inteligente que HashSet. En el último, you'd tiene que ordenar todo el conjunto de forma manual (esto es, una llamada a Collections.sort())

<EDIT>

En cuanto a maps, hay una gran cantidad de diferentes implementaciones . Cada uno tiene un propósito diferente. Por ejemplo, hay SortedMap, análogo a SortedSet. Luego, está WeakHashMap, que no funciona como un HashMap, en el sentido de que el recolector de basura puede quitar las claves. Como se puede imaginar, la elección entre un HashMap y un WeakHashMap no es trivial. Como siempre, depende de lo que quiera implementar con ellos.

</EDIT>

En cuanto a la historia, en mi proyecto actual, que sustituyen un HashSet con un SortedSet porque el rendimiento se ve afectada. DataCenter no se incendió.

Mis dos centavos.

1

Siempre que siga la buena práctica OO de dependiendo de un tipo abstracto, ¿qué importancia tiene?

Si, por ejemplo, encuentra que ha usado el Map incorrecto, simplemente cambie la implementación que está utilizando y porque todas sus dependencias están en Map todo funciona igual que antes con las diferentes características de rendimiento.

+1

Veo un problema que surge si confía en algunas de las características de rendimiento de una ArrayList, pero se dio cuenta de que necesitaba una LinkedList. Es posible que tenga que volver a escribir las partes de su código que ahora son ineficientes con LinkedList. –

1

Creo que está bien utilizar HashMap, HashSet y ArrayList como sus implementaciones principales. Cuando necesite un conjunto ordenado, es bueno saber que TreeSet está disponible; cuando haces cosas recursivas, de manera similar, es bueno tener LinkedList en tu bolsillo trasero. Pero programe las interfaces y luego puede intercambiar las implementaciones según sea necesario. Y si la misma colección necesita procesamiento como (por ejemplo) tanto una LinkedList como una ArrayList, no es gran cosa construir una desde la otra.

Trabaja con las implementaciones predeterminadas que has enumerado. Cuando hay problemas de rendimiento y hay motivos para creer que una implementación alternativa sería mejor, cambiarla y medir la diferencia. Cuando necesite un comportamiento especial (conjuntos ordenados, por ejemplo), use las clases especiales.

Este enfoque no me ha quemado todavía.

Cuestiones relacionadas