2010-03-23 42 views
5

¿Cuál es la necesidad de Collection framework en Java ya que todas las operaciones de datos (clasificación/adición/eliminación) son posibles con matrices y además matriz es adecuada para el consumo de memoria y el rendimiento también es mejor en comparación con las colecciones.¿Cuál es la necesidad del marco de recopilación en Java?

¿Alguien me puede señalar un ejemplo orientado a datos en tiempo real que muestra la diferencia en ambos (matriz/Colecciones) de estas implementaciones.

Respuesta

26
  • Las matrices no son redimensionables.
  • Java Collections Framework proporciona muchos tipos de datos útiles diferentes, como listas vinculadas (permite la inserción en cualquier lugar en tiempo constante), listas de matrices redimensionables (como Vector pero más frescas), árboles rojo-negro, mapas basados ​​en hash (como Hashtable pero enfriador).
  • Java Collections Framework proporciona abstracciones, por lo que puede consultar una lista como List, ya sea respaldada por una lista de matriz o una lista vinculada; y puede referirse a un mapa/diccionario como Map, ya sea respaldado por un árbol rojo-negro o una tabla hash.

En otras palabras, Java Collections Framework le permite usar la estructura de datos correcta, porque un tamaño no sirve para todos.

+2

+1 Definitivamente una mejor respuesta. Eliminé el mío que era torpe. –

+3

@Adeel: Probablemente podría mejorarlo aún más (discusiones sobre cuándo usarlo, Google Collections, etc.), si no estuviera intentando usar el arma más rápida en el oeste. :-P –

2

Las clases de colección, como las implementaciones de Conjunto, Lista y Mapa, están más cerca del "espacio problemático". Permiten a los desarrolladores completar el trabajo más rápidamente y entregar un código más legible/mantenible.

+0

Una muy buena suma para arriba. Gracias. –

0

Depende de las necesidades de su aplicación. Hay tantos tipos de colecciones, incluyendo:

  • HashSet
  • ArrayList
  • HashMap
  • TreeSet
  • TreeMap
  • ListaEnlazada

Así, por ejemplo, si necesita para almacenar pares de clave/valor, tendrá que escribir una gran cantidad de código personalizado si será bas ed de una matriz, mientras que las colecciones Hash * deberían funcionar de la caja. Como siempre, elija la herramienta adecuada para el trabajo.

6

varias razones:

  • clases de colección de Java proporciona una interfaz de nivel superior que los arrays.
  • Las matrices tienen un tamaño fijo. Las colecciones (ver ArrayList) tienen un tamaño flexible.
  • La implementación eficiente de estructuras de datos complicadas (por ejemplo, tablas hash) sobre las matrices en bruto es una tarea exigente. El HashMap estándar te da eso gratis.
  • Hay diferentes aplicación se puede elegir para el mismo conjunto de servicios: ArrayList LinkedList vs, HashMap vs TreeMap, sincronizada, etc.
  • Por último, las matrices de covarianza permiten: el establecimiento de un elemento de una matriz no está garantizado para tener éxito debido a errores de tipeo que son detectables solo en tiempo de ejecución. Los genéricos previenen este problema en las matrices.

Tome un vistazo a este fragmento que ilustra el problema de covarianza:

String[] strings = new String[10]; 
    Object[] objects = strings; 

    objects[0] = new Date(); // <- ArrayStoreException: java.util.Date 
+0

No, no se te permitirá convertir 'objects' en' Integer [] ', porque es realmente del tipo' String [] '; obtendrás 'ClassCastException' en ese punto. –

+0

Tienes razón. Reparado el fragmento. –

1

Para cada clase en la API Colecciones hay una respuesta diferente a su pregunta. Aquí están algunos ejemplos.

LinkedList: si elimina un elemento del medio de una matriz, paga el costo de mover todos los elementos a la derecha del elemento eliminado. No es así con una lista vinculada.

Conjunto: Si intenta implementar un conjunto con una matriz, agregar un elemento o probar la presencia de un elemento es O (N). Con un HashSet, es O (1).

Mapa: implementar un mapa utilizando una matriz daría las mismas características de rendimiento que la implementación putativa de la matriz de un conjunto.

0

Bueno, la premisa básica es "malo", ya que Java incluida la clase Dictionary desde antes de las interfaces existía en el idioma ...

colecciones ofrecen listas que son algo similar a las matrices, pero ofrecen muchas más cosas que son no. Asumiré que solo hablaste de List (e incluso de Set) y dejas Map fuera de él.

Sí, es posible obtener la misma funcionalidad que List y Set con una matriz, sin embargo, hay mucho trabajo involucrado. El objetivo de una biblioteca es que los usuarios no tengan que "implementar sus propias implementaciones" de cosas comunes.

Una vez que tiene una única implementación que todo el mundo usa, es más fácil justificar el gasto de recursos para optimizarla también. Eso significa que cuando se aceleran las colecciones estándar o se reduce su huella de memoria, todas las aplicaciones que las utilizan obtienen las mejoras de forma gratuita.

Una sola interfaz para cada cosa también simplifica la curva de aprendizaje de todos los desarrolladores: no hay muchas formas diferentes de hacer lo mismo.

Si quisiera tener una matriz que crece con el tiempo, probablemente no ponga el código de crecimiento en todas sus clases, sino que escriba un único método de utilidad para hacerlo. Lo mismo para borrado e inserción, etc. ...

Además, las matrices no son adecuadas para la inserción/eliminación, especialmente cuando se espera que el miembro .length refleje el número real de contenidos, por lo que se gastaría un gran cantidad de tiempo creciendo y reduciendo la matriz. Las matrices tampoco son adecuadas para Sets, ya que tendrías que iterar sobre toda la matriz cada vez que quisieras hacer una inserción para buscar duplicados. Eso mataría cualquier eficiencia percibida.

0

La colección es el marco en java y usted sabe que el marco es muy fácil de usar en lugar de implementar y luego usarlo y su preocupación es que no usemos el array hay inconvenientes de la matriz, ya que es estático, tiene que definir el tamaño de la fila al menos en el inicio, por lo que si su matriz es grande, se produciría principalmente un desperdicio de memoria de gran tamaño. , por lo que puede preferir ArrayList sobre él, que se encuentra dentro de la jerarquía de la colección.

La complejidad es otro problema como querer insertar en una matriz, entonces tienes que rastrearla para definir el índice para poder usar LinkedList todas las funciones se implementan solo necesitas usar y se volvió tu código menos complejo y puedes leer hay varias ventajas de la jerarquía de la colección

0

Las colecciones de Java tuvieron diferentes funciones, usabilidad y conveniencia.

Cuando en una aplicación queremos trabajar en un grupo de objetos, solo ARRAY no puede ayudarnos, o mejor dicho, puede llevar a hacer cosas con algunas operaciones engorrosas.

Una diferencia importante, es uno de facilidad de uso y comodidad, sobre todo teniendo en cuenta que las colecciones se expanden automáticamente de tamaño cuando sea necesario:

Colecciones subieron con métodos para simplificar nuestro trabajo.

Cada uno tiene una característica única:

  • List- Esencialmente una matriz de tamaño variable,
    Generalmente puede agregar/eliminar elementos en cualquier posición arbitraria;
    El orden de los elementos está bien definido (es decir, puede decir qué posición ocupa un elemento determinado en la lista).

    usados ​​ - La mayoría de los casos en los que sólo tiene que almacenar o se puede recorrer un "montón de cosas" y luego iterar a través de ellos.

  • Set- Las cosas pueden ser "existe o no" - cuando se agregan elementos de un conjunto, no hay noción de cuántas veces se añadió el artículo, y por lo general no hay noción de orden.

    Used- Recordando "qué elementos ya ha procesado", p. al hacer un rastreo web;
    Tomando otras decisiones de sí o no sobre un elemento, p. "es el elemento una palabra de inglés", "¿está el elemento en la base de datos?" , "es el artículo en esta categoría?" etc.

Aquí encontramos el uso de cada collection as per scenario:

Cuestiones relacionadas