viernes, 23 de mayo de 2008

Diferencias entre las colecciones List, Set y Map


Las colecciones son objetos que contienen objetos y que se usan para almacenar, obtener, manipular y comunicar datos incluidos en éstas. Normalmente, los objetos incluídos en ellas suelen ser del mismo tipo, aunque no necesariamente, depende de si son o no genéricas.

Las colecciones se diferencian de los arrays en que su tamaño no es fijo, esto es, son dinámicas. Se pueden realizar operaciones de incluir, eliminar, obtener, encontrar o recorrer una colección.

La Java Collections Framework (JCF) está constituída por sus interfaces (las más importantes List, Set y Map), interfaces de soporte (Iterator, ListIterator, Comparable y Comparator) y de clases de distintos usos, es decir, las implementaciones de las interfaces, y que sirven para
almacenar y manipular grupos de datos como una sola unidad, como una colección (HashSet, TreeSet, ArrayList, LinkedList, HashMap, TreeMap, etc.). También hay clases abstractas que tienen total o parcialmente implementados los métodos de la interface correspondiente, y que sirven para que los usuarios deriven de ellas sus propias clases de forma más sencilla.

Dos clases que implementan la misma interface se pueden utilizar exactamente de la misma forma, aunque difieran en cuanto a la implementación y, por tanto, su eficiencia.

Interfaces Comparable y Comparator
Sirven para mantener ordenadas las listas, así como los sets y los maps que deban mantener un orden.
Comparable declara el método compareTo() que compara su argumento implícito por el que se le pasa por parámetro, devolviendo -1, 0 ó 1 según el argumento sea anterior, igual o posterior al objeto o:
public int compareTo(Object o);

Comparatorpermite ordenar listas y colecciones cuyos objetos pertenecen a clases de cualquier tipo. La idea es parecida a la de Comparable, pero el usuario debe proporcionar la implementación de la interface. Esta interface declara los métodos equals(), que compara dos Comparators, y compare(), que devuelve -1, 0 ó 1 según el argumento sea anterior, igual o posterior al segundo:
public boolean equals(Object o);
public int compare(Object o1, Object o2);
______________________

Vamos a analizar las interfaces mmás importantes de la JCF:

INTERFACE LIST
Se encarga de definir métodos para trabajar con colacciones ordenadas y con elementos repetidos. Algunos de los
métodos de la interface List son los siguientes:
  • add(Object o): añade un objeto al final de la lista.
  • add(int indice, Object o): añade un objeto a la lista en la posición indicada.
  • get(int indice): devuelve el objeto de la lista de la posición indicada.
  • remove(int indice): elimina el objeto de la lista pasado por parámetro.
  • clear(): elimina todos los elementos de la lista.
  • indexOf(Object o): devuelve la posición de la primera vez que un elemento coincida con el objeto pasado por parámetro. Si el elemento no se encuentra devuelve -1.
  • lastIndexOf(Object o):devuelve la posición de la última vez que un elemento coincida con el objeto pasado por parámetro. Si el elemento no se encuentra devuelve -1.
  • size(): devuelve el número de elementos de la lista.
  • contains(Object o): devuelve verdadero si en la lista aparece el objeto pasado por parámetro, para lo cual utiliza intrínsecamente el método equals().
Existen implementaciones de la interface List, como son las clases ArrayList y LinkedList. Hay otras dos que no voy a comentar: Vector(h) y Stack(h).

ArrayList
se basa en índices, siendo cero la posición inicial e infinito su posición final, o lo que es lo mismo, contiene tantos objetos como necesitemos, almacenando los elementos en un array de objetos. Esta clase tiene varios constructores, siendo la más importante el ArrayList(), que construye un ArrayList con capacidad cero por defecto pero con infinitos objectos a insertar. Si le queremos dar un tamaño empleamos el constructor
ArrayList(int numElementos). ArrayList implementa la interfaz List y extiende de la clase abstracta AbstractList.

LinkedList almacena los elementos en una lista vinculada y permiten un acceso a ella de manera secuencial, pero su uso no es tan eficiente como los arrays.

INTERFACES
SET<E> y SORTEDSET<E>
Sirve para acceder a una colección sin elementos repetidos (hay que saber cuándo dos objetos son considerados iguales; para ello se usan equals() y hashcode();). Puede estar o no ordenada, y no declara ningún método adicional a los de Collection. Algunos de l
os métodos de la interface Set son los siguientes:
  • add(Object o): añade el objeto pasado por parámetro al Set siempre que éste no exista ya, y devuelve un booleano.
  • clear(): Elimina a todos los elementos del Set.
  • contains(Object o): devuelve true si el Set contiene el objeto pasado por parámetro. Para ello, se compara de forma interna con el método equals (o.equals(x);) o con el método hashCode().
  • isEmpty(): devuelve true si el Set está vacío.
  • iterator(): devuelve un iterador
  • remove(Object o): elimina el objeto pasado por parámetro si existe y devuelve un booleano.
  • size(): devuelve un entero que es el número de elementos del Set.
La interface SortedSet extiende de la interface Set y añade una serie de métodos, entre los que hay que destacar:
  • comparator(): obtiene el objeto pasado al constructor para establecer el orden; si se emplea el orden natural definido por la interface Comparable, devuelve null;
  • first() / last(): devuelve el primer o el último elemento del conjunto.
Existen dos implementaciones de conjuntos, como son la clase HashSet y la clase TreeSet.

HashSet<Elemento>
Implementa la inteface Set y está basada en una hash table. Hace distinción de identidad, esto es, que sólo pueden existir elementos diferentes (nada de duplicados). No se respeta el orden en el que se insertan los elementos y el tamaño del conjunto se adapta dinámicamente a lo que se necesite. HashSet implementa la interfaz Set y extiende de la clase abstracta AbstractSet.

TreeSet
<Elemento>
Implementa SortedSet y se basa en un TreeMap.

INTERFACES
MAP<Clave, Valor> y SORTEDMAP<Clave, Valor>
Un Map es una estructura de datos agrupados en parejas clave/valor; pueden ser considerados como una tabla de dos columnas. La clave debe ser única y se emplea para acceder al valor.
Map no deriva de Collection, pero sí se pueden ver los Maps como colecciones de claves, de valores o de claves/valores. Algunos de los
métodos de la interface Map son los siguientes:
  • clear(): elimina todos los mapeos del Map.
  • containsKey(Object clave): devuelve true si el Map contiene un mapeo igual que el objeto pasado por parámetro: boolean existe = productos.containsKey(producto);
  • containsValue(Object valor): devuelve true si el Map mapea a uno o más claves del objeto valor pasado por parámetro.
  • get(Object clave): devuelve el objeto valor de la clave pasada por parámetro; o null si el Map no encuentra ningún mapeo con esta clave.
  • isEmpty(): devuelve true si el Map está vacío.
  • put(Clave clave, Valor valor): asigna el valor pasado con la clave especificada a otro objeto valor.
  • remove(Object clave): elimina el mapeo que tenga la clave pasada por parámetro si existe, devolviendo el valor de dicho mapeo.
  • size(): devuelve un entero con el número de mapeos del Map.
La interface SortedMap añade métodos similares a los de SortedSet.

Existen tres implementaciones como son las clases HashMap, HashTable(h) y TreeMap.

HashMap<Clave,Valor>
esta clase mapea claves con valores, pero no permite claves duplicadas porque se solaparía el valor. Tanto la clave como el valor pueden ser cualquier tipo de objeto, y ambos pueden tener el valor null. Esta clase no garantiza el orden de los elementos ni que no puedan cambiar de orden. HashMap implementa la interfaz Map y extiende de la clase abstracta AbstractMap.
Esta clase posee internamente (de la clase AbstractMap) los métodos equals, hashCode y toString.

HashTable<Clave,Valor>
Es una clase que implementa Map y que almacena pares del tipo clave/valor en una tabla de dispersión. Al emplearla se proporciona un objeto que sirve como clave y otro como valor (vinculando el valor a la clave).Su insercion y búsqueda es rápida. Un ejemplo sería un listín de teléfonos, en el que dado un nombre se proporciona un teléfono.

TreeMap<Clave,Valor>
Esta clase implementa SortedMap y se basa en una árbol binario.

7 comentarios:

Juan Antonio Ruz dijo...

Estaría muy bien destacar los tres tipos principales de interfaces en tu entrada. Es decir en vez de hablar de ArrayList hablar de List y especificar que las clases que implementan dicha interface son ArrayList, VectorList, LinkedList... El contenido está muy bien y muy clarito

Indicar que el metodo contains de la interfaz List trabaja con equals y que en Set colaborar equals y hashCode
el Hashcode de un objeto se utiliza para identificarlo en la colección


para ordenar automaticamente ¿que clases existen para Map, y Set?

rafakatu dijo...

Ya he modificado el post. Ahora están definidos los métodos a partir de las interfaces, y apartir de estas, las clases.

Anónimo dijo...

te voy a arrancar el corazon hijo de puta mal parido de mierda cujudo perro maldito

Anónimo dijo...

hola

Anónimo dijo...

holi

Anónimo dijo...

Gracias!, es un buen aporte

Melina dijo...

debo Implementar un sistema para la visualización y actualización de datos de estudiantes. Al inicio el sistema debe cargar los datos del archivo estudiantes.txt y mostrar el siguiente menú:

1 Ver datos
2 Buscar Estudiante
3 Salir

que me recomiendan usar..un hashtable o hashmap?