Está en la página 1de 10

ARRAYLIST

Arrays vs. ArrayList

Ejemplo:almaceno las notas de 500 alumnos:

Qu pasa si queremos averiguar la nota de Elas? No sabemos "a priori" en qu posicin del arreglo est guardada la nota. La nica manera que tenemos de proceder es simplemente recorrer el arreglo y preguntar si ya llegamos al alumno que queremos:

Esto es lentsimo! Est bien, Elas es el peor caso, ya que se encuentra ltimo. A Elas lo encontraremos despus de haber efectuado 499 comprobaciones. Pero si suponemos que todos los alumnos son accedidos ms o menos con una misma probabilidad tenemos que el nmero de comprobaciones promedio que se necesitarn por bsqueda de alumno es de 250!

Collection

Si yo tengo un objeto Collection hay muchas cosas que no puedo asumir. No puedo asumir que el orden en el que lo recorro sea relevante, es decir, que si lo recorro de nuevo vea los elementos en el mismo orden en el que los vi la primera vez. Tampoco puedo asumir que no hay duplicados. No puedo asumir caractersticas de rendimiento: Preguntar si existe un objeto en la coleccin puede tardar desde muy poco hasta... mucho.

Collection
Una capacidad de un objeto Collection es la de poder ser recorrido. Como a este nivel no est definido un orden, la nica manera es proveyendo un iterador, mediante el mtodo iterator(). Un iterador es un objeto paseador que nos permite ir obteniendo todos los objetos al ir invocando progresivamente su mtodo next(). Tambin, si la coleccin es modificable, podemos remover un objeto durante el recorrido mediante el mtodo remove() del iterador. El siguiente ejemplo recorre una coleccin de Integer borrando todos los ceros:

A partir de Java 6 hay una manera simplificada de recorrer una collection (que sirve si no necesitamos borrar elementos). Se hace mediante un nuevo uso del keyword for:

Internamente este cdigo no hace otra cosa que obtener el iterador, pero queda mucho ms elegante y legible de esta manera. Pero al mismo tiempo, el no disponer del iterador explcitamente hace imposible usar esta sintaxis para hacer lo que hice en el ejemplo previo: ir borrando elementos.

Interfaces que extienden Collection

Hay cuatro interfaces que extienden Collection:


List Set Map Queue.

Cada una de ellas agrega condiciones sobre los datos que almacena y como contrapartida ofrece ms funcionalidad. A continuacin cuento de qu se trata cada una de ellas.

List

Hay dos implementaciones de List:

ArrayList: La ventaja de ArrayList por sobre un array comn es que es expansible, es decir que crece a medida que se le aaden elementos (mientras que el tamao de un array comun es fijo desde su creacin).
Lo bueno es que el tiempo de acceso a un elemento en particular es nfimo. Lo malo es que si queremos eliminar un elemento del principio, o del medio, la clase debe mover todos los que le siguen a la posicin anterior, para tapar el agujero que deja el elemento removido.

LinkedList (lista enlazada): los elementos son mantenidos en una serie de nodos atados entre s como eslabones de una cadena. Cada uno de estos nodos apunta a su antecesor y al elemento que le sigue. Nada ms. No hay nada en cada uno de esos nodos que tenga algo que ver con la posicin en la lista.
Para obtener el elemento nmero n, esta implementacin de List necesita entonces empezar desde el comienzo, desde el primer nodo, e ir avanzando al siguiente n veces. Para eliminar un elemento solamente hay que modificar a sus dos vecinos para que se conecten entre s ignorando al elemento que se est borrando. No es necesario hacerle ningn cambio al resto de los elementos de la lista. Su mtodo get(int) es particularmente lento porque, necesita recorrer para llegar al elemento pedido. Esto hace que recorrer la lista con un simple for(int i = 0 ; i < lista.size(); i++) Una LinkedList conviene recorrerse mediante iteradores. Un uso ideal de LinkedList es para la creacin de colas, en las que los elementos se aaden al final, y se eliminan del comienzo

SOLO VEREMOS ARRAYLIST EN ESTE CURSO

ArrayList

ArrayList - Generics
Anteriormente haba que hacer un casting manual cada vez que obtenamos un elemento, porque no podamos asegurar que los elementos fueran del tipo Persona; eso sin contar el tratamiento de errores que habra que hacer por el casting. Para solucionar esto aparecieron los generics, que proporcionan la forma de solventar este problema, para ello solo tenemos que escribir inmediatamente despus de la clase entre los signos < y > el tipo que van a tener los elementos de la estructura, as quedara algo como:

No hace falta realizar el casting para sacar el elemento de persona, ya que la hemos declarado como tipada y con eso aseguramos que dentro solo habr elementos de tipo Persona.

ArrayList - Iterator