(Objetivo
6.2):
Mtodo
equals()
El operador == permite evaluar si dos referencias son iguales, es decir, cuando se refieren al
mismo objeto. Para comparar si dos objetos son iguales, si los objetos en s mismo son
idnticos,
se
utiliza
el
mtodo
equals().
La clase String y todas las clases envoltorios (wrappers) de tipos primitivos, tienen el mtodo
equals() redefinido. Por esto mismo se pueden comparar si dos objetos tienen un mismo
estado.
Si se quiere utilizar (de manera correcta) un objeto como clave en una coleccin hash, se debe
sobreescribir el mtodo equals(), para de este modo permitir considerar dos instancias iguales.
Mtodo
hashCode()
Generalmente los hashcodes son utilizados para mejorar la performance de grandes
colecciones de informacin. Este cdigo se utiliza para determinar donde se guardar el
objeto dentro de una coleccin (HashMap, HashSet o sus subtipos), y como se debe localizar.
Para el examen se debe saber que colecciones lo utilizan, y diferenciar los usos apropiados o
correctos
de
los
legales.
Colecciones
Tipos de colecciones:
(Objetivo
6.1):
List: Sus operaciones estn basadas en los ndices de los elementos en la coleccin.
Todas sus implementaciones tienen sus ndices ordenados. Cuando se agrega un
elemento a la coleccin se puede hacer especificando el ndice en el cual tiene que
estar, o sin especificarlo (en este caso se posiciona al final).
- ArrayList: Provee una rpida iteracin y un rpido acceso aleatorio. Pero es ms
1
lento
para
insertar
y
quitar
elementos
que
LinkedList.
- Vector: Es una coleccin primitiva de las primeras versiones de java. Es bsicamente
similar a ArrayList, salvo que todos sus mtodos estn sincronizados para el manejo
seguro
de
hilos
(thread
safe).
- LinkedList: Es una coleccin como ArrayList, excepto porque sus elementos se
encuentran doblemente ligados (uno con otro). Este doble vinculo otorga nuevos
mtodos para agregar o quitar elementos del principio o el final. Su iteracin es ms
lenta que ArrayList. A partir de Java 5, esta coleccin implementa la interface Queue.
De esta manera puede ser tratada como una cola, y posee los mtodos: peek(), poll() y
offer().
Set: Es un conjunto de elementos nicos. Es decir, no se permiten objetos duplicados.
Para lograr este comportamiento se utiliza el mtodo equals(), que permite verificar si
dos
instancias
son
idnticas.
- HashSet: Es una coleccin que no mantiene un orden especfico. Utiliza el cdigo
de hash de los objetos insertados. Por este motivo mientras ms eficiente sea la
implementacin del mtodo hashCode(), mejor ser la performance de acceso. Es til
cuando se necesita una coleccin sin elementos duplicados y en la cual no importe el
orden
de
iteracin.
- LinkedHashSet: Es la versin ordenada de HashSet. Mantiene un doble enlace entre
sus elementos como si fuera una lista. Es til cuando se necesita (a diferencia de
HashSet) una coleccin en donde el orden de iteracin sea importante.
- TreeSet: Es una coleccin que contiene sus elementos ordenados. Utiliza un rbol de
estructura rojo-negro, y garantiza que los elementos se encuentren en orden
ascendente, de acuerdo a su orden natural. A partir de Java 6, esta coleccin
implementa NavigableSet.
Map: Son colecciones con elementos compuestos de parejas clave/valor. Las claves
de los elementos son nicas. Al igual que la interface Set, utiliza el mtodo equals()
para determinar si dos objetos son iguales. Muchas de sus operaciones estn basadas
en
las
claves.
- HashMap: Es una coleccin que no mantiene un orden especfico. Utiliza el cdigo
de hash sobre las claves, para determinar el orden de sus elementos. Es til cuando se
necesita un mapa en el cul no importe el orden de iteracin. Permite un solo valor
null
como
clave,
y
multiples
valores
null
en
la
coleccin.
- Hastable: Como la clase Vector, es una implementacin de las primeras versiones de
java. Es similar a HashMap, a diferencia que sus mtodos se encuentran
sincronizados. Otra de las diferencias es que no permite valores null tanto en la claves
como
en
los
valores.
- LinkedHashMap: Similar a HashMap, a diferencia que mantiene los elementos
ordenados. Y porque es un poco ms lento para agregar o quitar elementos de la
coleccin.
Pero
permite
una
iteracin
ms
veloz.
- TreeMap: Es un mapa ordenado de forma natural. Tambin permite definir un tipo
de orden (a travs de las interfaces Comparable y Comparator). A partir de Java 6,
2
Buscando
elementos
en
las
colecciones
Las clases Collections y Arrays poseen un mtodo que permite buscar un elemento especfico,
binarySearch(). Las bsquedas exitosas devuelven el valor entero del ndice del elemento, las
que no tienen xito devuelven un entero negativo que representa el lugar de insercin. Es
obligatorio que la coleccin se encuentre ordenada antes de realizar cualquier bsqueda, caso
contrario se devolver un valor impredecible. Si la coleccin ha sido ordenada mediante un
objeto Comparator, la bsqueda debe realizarse pasando como segundo parmetro el mismo
objeto
Comparator.
Los siguientes mtodos pertenecen tanto a Arrays como a Collections:
binarySearch(ObjetoBuscado
o)
binarySearch(ObjetoBuscado
o,
Comparable
c)
Convirtiendo
arreglos
a
listas
y
listas
a
arreglos
Las interfaces List y Set poseen el mtodo toArray(), el cual convierte la lista de elementos en
un arreglo. La clase Arrays tiene un mtodo llamado asList(), este copia el contenido de un
arreglo
adentro
de
una
lista.
Cuando se actualiza un elemento de algunas de las dos colecciones, automticamente se
actualiza
la
otra.
Iterator
Es un objeto que est asociado con una coleccin especfica. Permite iterar a travs de la
coleccin paso a paso. Los dos mtodos de la interface Iterator que se deben saber para el
examen son:
boolean hasNext(): Devuelve true si hay al menos un elemento ms en la coleccin
que se esta atravesando.
Object next(): Devuelve el prximo objeto en la coleccin, y mueve hacia adelante el
puntero.
Se puede utilizar un tipo parametrizado junto al objeto Iterator, de esta menara el mtodo
next()
devolver
dicho
tipo,
evitando
las
necesidades
de
casteo.
Set
Se debe prestar atencin el tipo de implementacin que se utiliza. Una coleccin HashSet
permite contener elementos de diferentes tipos (si el tipo parametrizado es Object, o el mismo
se excluye). Pero una coleccin TreeSet (la cual contiene a sus elementos en orden) no
permite
contener
objetos
que
no
sean
comparables
entre
s.
Map
A la hora de utilizar este tipo de colecciones, se debe prestar atencin a las claves utilizadas.
Es decir, si un objeto clave (insertado en la coleccin) luego modifica su estado, puede ser
que el mismo no sea hallado en el mapa. Esta situacin se da debido a que el mtodo
4
hashCode(),
devuelve
un
cdigo
diferente.
NavigableSet
Esta interface (implementada nicamente por TreeSet) posee diversos mtodos de utilidad:
NavigableMap
Esta interface (implementada nicamente por TreeMap) posee diversos mtodos de utilidad:
Queue
La coleccin PriorityQueue ordena sus elementos utilizando una prioridad definida por el
usuario. La prioridad puede ser el orden natural, pero tambin se puede ordenar utilizando un
objeto Comparator. La interface Queue posee mtodos que no se encuentran en ninguna otra
coleccin:
peek(): Devuelve el primer elemento de la cola (o el que tenga mayor prioridad).
poll(): Devuelve el primer elemento de la cola (o el que tenga mayor prioridad), y
luego lo elimina de la cola.
offer(T o): Agrega un elemento al final de la cola (o en el lugar donde indique su
prioridad).
5
RESUMEN:
TWO-MINUTE
Sobrescribiendo hashCode() y equals() (Objetivo 6.2):
DRILL
hashCode().
Colecciones (Objetivo 6.1):
Las acciones comunes sobre las colecciones son aadir elementos, eliminarlos,
verificar su inclusin, obtenerlos y iterar sobre los mismos.
Existen
cuatro
tipos
bsicos
de
colecciones:
Lists
Sets
Maps
- Queues
El ordenamiento puede ser alfabtico, numrico o definido por el usuario.
Atributos clave de las clases de coleccin (Objetivo 6.1):
Set:
no
puede
tener
elementos
duplicados.
- Queue: produce los elementos en el orden determinado por una disciplina de cola.
Map: un grupo de parejas de objetos clave-valor, que permite efectuar bsquedas de
valores utilizando una clase. Un mapa permite buscar un objeto utilizando otro objeto.
Tambin se lo denomina matriz asociativa o diccionario.
Estas interfaces utilizan tipos genricos, es decir, se debe especificar el tipo de objeto/s que
almacenar el contenedor. Esto se realiza a travs de corchetes angulares que rodean los
parmetros
de
tipo.
De ser posible, se debe intentar escribir la mayor parte del cdigo para que se comunique con
estas interfaces. El nico lugar donde se debera especificar el tipo concreto del contenedor es
en
la
creacin
del
mismo.
Ver
ejemplo:
Main01.java
Existen mtodos de utilidad en las clases Arrays y Collections de java.util que aaden grupos
de elementos a una coleccin:
Collections.addAll (Collection c, T elements): toma un objeto de tipo Collection
como primer argumento y una lista de valores separados por coma. Aade los
elementos a la coleccin.
Arrays.asList (T a): toma una lista de valores separados por coma y lo transforma
en un objeto List.
Ver
ejemplo:
Main02.java
List
Las listas garantizan que los elementos se mantengan en una secuencia concreta. La interface
List aade varios mtodos a Collection que permiten la insercin y la eliminacin de
elementos
en
mitad
de
una
lista.
Existen dos tipos de objetos List:
ArrayList: Es el que mejor permite acceder a los elementos de forma aleatoria, pero
que resulta ms lento a la hora de insertar y eliminar elementos en mitad de una lista.
LinkedList: Proporciona un acceso secuencial ptimo, siendo las inserciones y
borrados en mitad de una lista enormemente rpidos. Resulta relativamente lento para
los accesos aleatorios, pero tiene muchas ms funcionalidades que ArrayList.
Mtodos de la interface:
boolean contains(Object o): Permite averiguar si un objeto se encuentra dentro de la
lista.
boolean remove(Object o): Permite eliminar un objeto, pasando la referencia al
mismo.
int indexOf(Object o): Pasando como parmetro una referencia a un objeto, devuelve
10
ejemplo:
Main03.java
Set
Los objetos de tipo Set (conjuntos) no permiten almacenar ms de una instancia de cada
objeto, impide la duplicacin. Para insertar un nuevo elemento se debe verificar la no
pertenencia, por este motivo la operacin ms importante de un conjunto suele ser el de la
bsqueda. Set tiene la misma interfaz que Collection, por lo que no existe ninguna
funcionalidad
adicional.
Existen tres tipos de contenedores Set:
HashSet: Utiliza el mecanismo de hash para acelerar las bsquedas de elementos.
TreeSet: Mantiene los elementos ordenados en una estructura de datos de tipo rbol
rojo-negro. Este objeto es til para mantener los objetos ordenados.
LinkedHashSet: Es un subtipo de HashSet, por lo tanto tambin emplea una funcin
hash para acelerar las bsquedas, pero mantiene los elementos en orden de insercin
utilizando una lista enlazada.
Ver
ejemplo:
Main04.java
Queue
Una cola es normalmente un contenedor de tipo FIFO (first-in, first-out). El orden en el que
se introduzcan los elementos coincidir con el orden en que estos sern extrados. Las colas
11
son
especialmente
importantes
Existen dos tipos de contenedores Queue:
en
la
programacin
concurrente.
una
boolean
Ver
excepcin
add(E
E
E
Retorna
e)
remove()
element()
ejemplo:
un
boolean
valor
offer(E
E
E
especial
e)
poll()
peek()
Main05.java
Map
Los mapas permiten asociar objetos con otros objetos. Es decir, almacenan parejas de clavevalor. En los contenedores no se pueden almacenar primitivas, por eso la caracterstica
autoboxing convierte las primitivas en sus correspondientes objetos envoltorios. Este tipo de
contenedores puede expandirse fcilmente para que sean multidimensionales, basta con
definir
un
objeto
Map
cuyos
valores
sean
tambin
mapas.
Existen tres tipos de contenedores Map:
HashMap: Estn diseados para un acceso rpido.
TreeMap: Mantiene sus claves ordenadas y no es tan rpido como el anterior.
LinkedHashMap: Mantiene sus elementos en orden de insercin, pero proporciona un
acceso rpido con mecanismos de hash.
Mtodos de la interface:
boolean containsKey(Object key): Permite evaluar si existe una determinada clave en
el mapa.
boolean containsValue(Object value): Permite evaluar si existe un determinado valor
en el mapa.
V get(Object key): Dado un objeto clave, devuelve el valor asociado a dicha clave.
V put(K key, V value): Agrega un nuevo elemento al mapa.
void putAll(Map m): Agrega todos los elementos de un mapa a otro.
SetkeySet(): Devuelve un conjunto Set con todas las claves. (Las claves no pueden
estar repetidas).
12
Collectionvalues(): Devuelve una coleccin con todos los valores del mapa.
Ver
ejemplo:
Main06.java
Iteradores
Iterator
Es una interface que permite desplazarse a travs de una secuencia y seleccionar cada uno de
los objetos que la componen.
boolean hasNext(): Permite ver si hay ms objetos en la secuencia.
E next(): Obtiene el siguiente objeto de la secuencia.
void remove(): Elimina el ltimo elemento devuelto por el iterador.
ListIterator
Es un subtipo ms potente de Iterator que solo se genera mediante las clases List. ListIterator
es bidireccional, puede generar los ndices de los elementos siguiente y anterior, en relacin
al lugar de la lista hacia el que el iterador est apuntando y tambin posee otras
funcionalidades. Los mtodos que adiciona esta interface son:
boolean hasPrevious(): Realiza la misma accin que hasNext() pero en sentido
contrario.
E previous(): Idem next() pero en sentido contrario.
int nextIndex(): Obtiene el nmero de ndice del elemento siguiente.
int previousIndex(): Obtiene el nmero de ndice del elemento anterior.
void set(E e): Permite sustituir el elemento al que apunta por el iterador.
void add(E e): Inserta un elemento en la lista.
NOTA: NO HAY NECESIDAD DE UTILIZAR LAS CLASES ANTIGUAS Vector,
Hashtable y Stack.
13