Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Clase 6 Collections e
introduccin a generics
Ezequiel Aranda
Sun Microsystems Campus
Ambassador
AGENDA
>Object
>toString
>equals
>hashCode
>Collections
>List
>Set
>Map
>Queue
>Ordenamiento
>Comparable
>Comparator
Sobrescribir toString()
>Al pasar una referencia a un objeto como
parmetro al mtodo toString(),el mtodo
toString de dicho objeto es llamado.
>Si ejecutamos algo como:
HardToRead h = new HardToRead()
System.out.println(h);
class Bob {
int shoeSize;
String nickName;
Bob(String nickName, int shoeSize) {
this.shoeSize = shoeSize;
this.nickName = nickName;
}
public String toString() {
return ("I am a Bob, but you can call me " +
nickName +". My shoe size is " + shoeSize);
}
}
// Pregunta
// Bob f = new Bob("GoBobGo", 19);
// System.out.println(f);
Sobreescribir equals()
public class EqualsTest {
public static void main (String [] args) {
Metre one = new Metre(8);
Metre two = new Metre(8);
if (one.equals(two))
System.out.println("one and two are equal");
}
}
class Metre {
private int value; Metre(int val) {
value = val;
}
}
// One es igual a two?
class Metre {
private int value;
Metre(int val) {value = val;}
public int getValue() {
return value;
}
public boolean equals(Object o) {
if ((o instanceof Metre) &&
(((Metre)o).getValue() ==
this.value)) {
return true;
}
else { return false; }
}
}
Sobrescribir hashCode()
>Si bien puede pensarse que es un
identificador de objetos, no necesariamente
es nico.
>Debemos saber cuales collections lo utilizan
(son las que tienen el prefijo hash en el
nombre, as que no debera ser
particularmente difcil).
>Tambin debemos poder reconocer las
implementaciones apropiadas de hashCode().
Ejemplo de hashcode
Entendiendo hashCode()
>Si dos objetos son iguales, sus hashcodes
deben ser iguales.
>Pero si dos objetos tienen el mismo hashcode,
no necesariamente son iguales.
>En el examen no se evala que sepamos
rankear las eficiencias de distintos hashcodes.
>Pero debemos saber cuales funcionarn y
cuales no (es decir, cuales nos permitirn
encontrar un objeto en la coleccin)
Implementando hashCode()
>La variable transient volver (luego de
serializar el objeto) con un valor por defecto,
en vez del valor que tena la variable al
momento de guardarla.
>En conclusin: las variables transient pueden
dar problemas en las implementaciones de
equals() y hashCode().
Contratos
>En Java, un contrato es un
conjunto de reglas que
deberan ser seguidas si
queremos que nuestras
implementaciones
funcionen de la forma
esperada.
>En otras palabras, si no seguimos los contratos,
nuestro cdigo posiblemente compile y corra,
pero podra fallar inesperadamente en su
ejecucin.
El contrato de equals
>Es reflexivo. Para cualquier referencia por
ejemplo x, x.equals(x) debera devolver true.
>Es simtrico. Para cualquier par de
referencias, por ejemplo x e y, si x.equals(y)
es true si y solo si y.equals(x) devuelve true.
>Es transitivo. Para cualquier conjunto de
referencias, por ejemplo 'x', 'y' y 'z', si
x.equals(y) devuelve true y para y.equals(z)
devuelve true, entonces z.equals(x) debe
devolver true.
El contrato de hashCode
>Siempre que es invocado con el mismo objeto
ms de una vez durante la ejecucin de una
aplicacin Java, el hashCode () debe devolver
constantemente el mismo nmero entero,
siempre y cuando la informacin utilizada
para las comparaciones equals() no
modifiquen el objeto. Este entero no es
necesario que mantenga la coherencia de la
ejecucin en una aplicacin a otra ejecucin
de la misma aplicacin.
Requisito
Permitido (aunque no
requerido)
x.hashCode() ==
y.hashCode()
x.hashCode() ==
y.hashCode()
x.equals(y) == true
x.equals(y) ==
false
Sin requerimientos
de hashCode().
x.hashCode() !=
y.hashCode()
x.equals(y) ==
false
Collections
>El API comienza con la definicin de varias
interfaces, de las cuales debemos conocer las
siguientes para el examen:
>Collection
>List
>Queue
>Set
>Map
>SortedSet
>SortedMap
Collections (II)
>Hay un gran nmero de clases concretas,
para el examen alcanzar con conocer las
siguientes 13:
Maps
Sets
Lists
HashMap
HashSet
ArrayList
Hashtable
LinkedHashSet
Vector
TreeMap
TreeSet
LinkedSet
LinkedHashMap
Queues
PriorityQueue
Utilities
Collections
Arrays
La palabra collection
>Es fcil confundir Collection con
Collections, y viceversa.
>Collections es una clase, con mtodos
utilitarios.
>Mientras que Collection es una interfaz con
declaraciones de mtodos comunes a la
mayora de las colecciones, incluyendo add(),
remove(), contains(), size() e iterator().
Colecciones
>Lists, listas de cosas (implementan List).
>Sets, conjuntos de cosas de cardinalidad 1
(implementan Set).
>Maps, cosas con IDs nicos (implementan
Map)
>Queues, cosas ordenadas en la forma en que
sern procesadas.
Ordenada
>Cuando una coleccin est ordenada,
significa que podemos recorrer sus elementos
en un orden especifico.
>Una Hashtable, no est ordenada.
>Un ArrayList es exactamente como un array.
>Nunca podremos llamar al mtodo sort en
una coleccin no ordenada.
Sorted
>Significa que el orden de una coleccin esta
establecido por una regla.
>Una regla para ordenar un conjunto de palabras
podra ser colocarlas en orden alfabtico.
>Para nmeros enteros, podramos ordenar de
mayor a menor de acuerdo a su valor.
>Y como podemos hacer con objetos? No hay una
regla para la clase Foo, salvo que el desarrollador
de esa clase provea una, utilizando la interfaz
Comparable.
Interfaz List
>Las listas tienen ndices.
>De hecho, la nica cosa que diferencia a algo
que es una List de algo que no lo es, es un
conjunto de mtodos relacionados con el
ndice (por ej.: get(int index), indexOf(Object
o), add(int index, Object obj))
>Las tres implementaciones de List estn
ordenadas por el valor del ndice.
ArrayList
>La forma de ver esta implementacin es que
es un array que puede crecer.
>Esta ordenada, pero no es sorted (slo est
ordenada por el ndice).
>Se utiliza cuando necesitamos iterar
rpidamente, pero no necesitamos agregar o
borrar elementos.
Vector
>Un vector es bsicamente lo mismo que un
ArrayList, pero sus mtodos estn
sincronizados.
>En general, es preferible utilizar ArrayList en
vez de Vector, dado que los mtodos
sincronizados reducen la performance de
nuestro programa.
>Vector y ArrayList son las nicas clase que
implementan RandomAccess.
LinkedList
>Est ordenada por el ndice, pero a diferencia
de ArrayList, los elementos estn doblemente
vinculados.
>LinkedList itera ms lento que un ArrayList,
pero las inserciones y los borrados son ms
rpidos.
>Soporta los mtodos peek(), poll() y offer() (a
partir de Java 5, porque implementa Queue).
Interfaz Set
>Un Set no permite
duplicados.
>Se utiliza equals()
para determinar si
dos objetos son
identicos.
HashSet
>No esta orden, ni utiliza una regla de
ordenamiento.
>Utiliza el hashcode del elemento para
localizarlo. Cuanto mejor la implementacin,
mejor performance en el acceso.
>Se utiliza cuando el nico requisito es no
tener duplicados y no importa el orden al
iterarlo.
LinkedHashSet
>Es una versin ordenada de HashSet.
>Mantiene una lista doblemente vinculada de
los elementos.
>El orden de iteracin se corresponde con el de
insercin de los elementos.
TreeSet
>Junto con TreeMap, son las nicas
colecciones con regla de ordenamiento.
>Por defecto, usa el orden natural, pero tiene
un constructor que permite establecer la
regla de ordenamiento.
>Usa una estructura de rbol Red-Black que
asegura que los elementos se encuentren en
orden ascendente.
Interfaz Map
>Un mapa posee identificadores nicos.
>Se mapea una clave nica (ID) a un valor
especifico. Ambos, clave y valor, son objetos.
>Las implementaciones de Map permiten
buscar un valor dada la clave.
HashMap
>HashMap es una coleccin sin orden ni regla
de ordenamiento.
>Se utiliza cuando no nos importa el orden al
iterar sobre los elementos, sino encontrar
siempre el valor dada la clave.
>Permite un null en la claves, y mltiples nulls
entre los valores de la coleccin.
Hashtable
>Es la versin sincronizada de HashMap.
>Al igual que el Vector, conviene utilizarlo solo
cuando es necesario que los mtodos sean
sincronizados, de otra forma, estaremos
reduciendo la performance de nuestro
programa en forma innecesaria.
>Un Hashtable no acepta ningn null.
LinkedHashMap
>Mantiene el orden de insercin.
>Esto hace que sea algo ms lento que
HashMap para agregar y remover elementos.
>Sin embargo, la iteracin a travs de los
elementos es ms rpida.
TreeMap
>Permite establecer
un orden de los
elementos utilizando
Comparator o
Comparable.
Interfaz Queue
>Un Queue est diseado para contener una
lista de to-dos o cosas que deben procesarse
de alguna forma.
>Si bien es posible darle otros ordenamientos,
en general se piensa en un queue como un
FIFO (first in, first out).
>Soportan todos los mtodos estndar de las
colecciones y aaden mtodos para agregar y
quitar elementos y evaluar los elementos del
queue.
PriorityQueue
>Incluida en Java
5.
>Su propsito es
crear una cola
ordenada por
prioridad en vez
de utilizar el
enfoque FIFO.
>Sus elementos se ordenan con una regla de
ordenamiento.
Resumen
ArrayList
>Crece dinmicamente.
>Provee mejores mecanismos de insercin y
bsquedas que los arrays.
List myList = new ArrayList();
ArrayList (II)
>ArrayList<String> es similar en muchas formas
a String[].
>Sin embargo, ArrayList<String> es ms
verstil.
>Por ejemplo:
List<String> list = new
ArrayList<String>();
String[] list = new String[xxx];
//xxx debe ser un valor especfico
Autoboxing en colecciones
>En general, las colecciones no pueden
contener tipos primitivos.
myInts.add(new Integer(42)); // pre
Java 5.0
Ordenando Colecciones
ArrayList<String> stuff = new
ArrayList<String>();
stuff.add("Denver");
stuff.add("Boulder");
stuff.add("Vail");
stuff.add("Aspen");
stuff.add("Telluride");
System.out.println("unsorted " + stuff);
Collections.sort(stuff);
System.out.println("sorted " + stuff);
Comparable
class DVDInfo implements
Comparable<DVDInfo> {
public int compareTo(DVDInfo d) {
return title.compareTo( d.getTitle() );
}
}
Comparable (II)
>Es importante recordar que cuando
sobrescribimos equals(), debemos tomar un
argumento de tipo Object.
>Sin embargo, cuando sobrescribimos
compareTo(), debemos tomar un argumento
del tipo que estamos ordenando.
java.util.Comparator
intobjOne.compareTo(objTwo)
intcompare(objOne,objTwo)
Retorna
NegaGvosiobjOne<objTwo
CerosiobjOne==objTwo
PosiGvosiobjOne>objTwo
Usando Listas
>hasNext() retorna true si hay al menos un
elemento mas en la coleccin que estamos
recorriendo.
>Invocar hasNext no nos posiciona en el elemento
siguiente.
Usando Sets
>Recuerden que los Sets son sin duplicados.
boolean[] ba = new boolean[5]
//definicin de s
ba[0] = s.add(homer");
ba[1] = s.add(new Integer(42));
ba[2] = s.add("bart");
ba[3] = s.add(homer");
ba[4] = s.add(new Object());
Usando Maps
Map<Object, Object> m = new
HashMap<Object,Object>();
m.put("k1", new Dog("aiko"));
// agregamos pares clave/ valor
m.put("k2", Pets.DOG);
m.put(Pets.CAT, "CAT key");
Dog d1 = new Dog("clover");
m.put(d1, "Dog key");
m.put(new Cat(), "Cat key");
Usando PriorityQueue
>PriorityQueue, a diferencia de las estructuras
FIFO, ordena sus elementos utilizando una
regla de ordenamiento definida por el
usuario.
>Un PriorityQueue puede ordenarse utilizando
un Comparator, que nos permite definir el
ordenamiento como deseemos.
>Las Queues tienen mtodos que no se
encuentran en otras subinterfaces de
Collection: peek, poll y offer.
Pregunta
String[] sa = {">ff<", "> f<", ">f <",
">FF<" };
PriorityQueue<String> pq3 = new
PriorityQueue<String>();
for(String s : sa)
pq3.offer(s);
for(String s : sa)
System.out.print(pq3.poll() + " ");
>Cul es el resultado?
Preguntas