2009-05-04 24 views
33

¿Hay alguna diferencia práctica entre un Set y Collection en Java, además del hecho de que un Collection puede incluir el mismo elemento dos veces? Ellos tienen los mismos métodos.cuándo usar Set vs. Collection?

(Por ejemplo, ¿Set me dan más opciones para utilizar las bibliotecas que aceptan Set s pero no Collection s?)

edición: puedo pensar en por lo menos 5 situaciones diferentes para juzgar esta cuestión. ¿Alguien más puede venir con más? Quiero asegurarme de que entiendo las sutilezas aquí.

  1. diseñar un método que acepta un argumento de Set o Collection. Collection es más general y acepta más posibilidades de entrada. (si estoy diseñando una clase o interfaz específica, estoy siendo más amable con mis consumidores y más estricto con mis subclasistas/implementadores si uso Collection.)
  2. diseñando un método que arroja Set o Collection. Set ofrece más garantías que Collection (incluso si es solo la garantía de no incluir un elemento dos veces). (si estoy diseñando una clase o interfaz específica, estoy siendo más amable con mis consumidores y más estricto con mis subclasistas/implementadores si uso Set.)
  3. diseñando una clase que implementa la interfaz Set o Collection. Problemas similares al # 2. Los usuarios de mi clase/interfaz obtienen más garantías, los subclassers/ejecutores tienen más responsabilidad.
  4. diseñando una interfaz que amplía la interfaz Set o Collection. Muy similar a # 3.
  5. código de escritura que utiliza un Set o Collection. Aquí también podría usar Set; las únicas razones para que use Collection es si obtengo un Collection del código de otra persona, o si tengo que manejar una colección que contiene duplicados.
+1

buena pregunta, pero las respuestas no son buenas – Kemoda

Respuesta

37

Collection es también el supertipo de List, Queue, Deque, y otros, por lo que le da más opciones. Por ejemplo, trato de usar Collection como un parámetro para los métodos de la biblioteca que no deberían depender explícitamente de un cierto tipo de colección.

Generalmente, debe usar la herramienta adecuada para el trabajo. Si no desea duplicados, use Set (o SortedSet si desea realizar pedidos, o LinkedHashSet si desea mantener el orden de inserción). Si desea permitir duplicados, use List, y así sucesivamente.

+1

¿De qué manera el uso de una colección le da * más * opciones? Usar cosas más generales generalmente le da * menos * poder. – Martijn

+5

Da más opciones a la persona que llama a un método que toma un parámetro Colección porque puede pasar una Lista, Establecer o Cola sin tener que hacer ninguna conversión. –

+4

Sí, estaba hablando desde el punto de vista de la persona que escribe un método que acepta una Colección. Para un método * devolver * algo, prefiero usar el tipo apropiado para el trabajo, como dije. –

3

Consulte Java Collection tutorial para un buen recorrido del uso de la Colección. En particular, revisa la jerarquía de clases.

8

Creo que ya lo tiene resuelto: use un Set cuando desee excluir específicamente los duplicados. Collection es generalmente el mínimo común denominador, y es útil especificar API que acepte/devuelva esto, lo que le deja espacio para cambiar los detalles más adelante si es necesario. Sin embargo, si los detalles de su aplicación requieren entradas únicas, use Set para aplicar esto.

También vale la pena considerar si el orden es importante para usted; si es así, use List o LinkedHashSet si le interesa el pedido y unicidad.

+0

API generalmente debería devolver un tipo más específico que 'Colección'. Por ejemplo, si es posible devolver una 'Lista', entonces hágalo. Solo si no está seguro del tipo de devolución, podría considerar devolver 'Collection'. – Flow

1

Debe utilizar un conjunto cuando eso es lo que desea.

Por ejemplo, una lista sin ningún pedido o duplicados. Los métodos como contiene son bastante útiles.

Una colección es mucho más genérica. Creo que lo que mmyers escribió sobre su uso lo dice todo.

2

Como @mmyers states, Collection incluye Set, así como List.

Cuando declara algo como un conjunto, en lugar de una colección, está diciendo que la variable no puede ser una lista o un mapa. Sin embargo, siempre será una colección. Entonces, cualquier función que acepte una Colección aceptará un Conjunto, pero una función que acepta un Conjunto no puede tomar una Colección (a menos que lo lances a un Conjunto).

+0

En realidad, Map no extiende Collection. –

+0

Tienes razón, mi error. Acabo de editar la respuesta para arreglar esto. – pkaeding

1

La diferencia práctica es que establece la establece lógica, es decir, no duplicados y desordenados, mientras que la colección no lo hace. Entonces, si necesita una Colección y no tiene un requisito particular para evitar duplicados, entonces use una Colección. Si tienes el requisito para Set entonces usa Set. Generalmente use la interfaz más alta posible.

2

Otra cosa a tener en cuenta ... Los juegos tienen una sobrecarga adicional en tiempo, memoria y codificación para garantizar que no haya duplicados. (Tiempo y memoria porque los conjuntos suelen estar respaldados por un HashMap o un Árbol, que agrega sobrecarga sobre una lista o una matriz. Codificación porque debe implementar los métodos hashCode() y equals())

Yo suelo usar se establece cuando necesito una implementación rápida de contains() y uso Collection o List de lo contrario, incluso si la colección no debe tener duplicados.

0

Como Collection es un tipo estupendo de Conjunto y Conjunto Clasificado que se puede pasar a un método que espera una Colección. La recopilación solo significa que puede o no ordenarse, ordenar o permitir duplicados.

Cuestiones relacionadas