curso de programación en java - laboratorio ss.oo...
TRANSCRIPT
![Page 1: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/1.jpg)
1 mayo de 2010 Curso de programación en Java
Curso de Programación en Java
![Page 2: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/2.jpg)
2 mayo de 2010 Curso de programación en Java
Índice • Excepciones • Genéricos • Colecciones
– Interfaces: • Collection, Set, List, Queue, Map, SortedSet, SortedMap
– Implementaciones • HashSet, ArrayList, LinkedList, HashMap, TreeSet, TreeMap
– Algoritmos
• Concurrencia – Threads
![Page 3: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/3.jpg)
3 mayo de 2010 Curso de programación en Java
Excepciones
![Page 4: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/4.jpg)
4 mayo de 2010 Curso de programación en Java
Introducción (I)
• La idea es separar el funcionamiento normal de un programa de la gestión de los errores.
• Si algo va mal: – División por cero. – No hay más memoria. – No existe el fichero deseado.
• Se lanza una excepción que HAY que tratar.
![Page 5: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/5.jpg)
5 mayo de 2010 Curso de programación en Java
Introducción (II)
• El tratamiento de la excepción será distinto para cada caso, separando claramente lo que se debe hacer en cada caso
• Si se puede recuperar del error continuará la ejecución normalmente, sino finaliza – Si no existe el fichero, pide otro nombre (bucle) – Si entrada en formato incorrecto, pide otro dato.
![Page 6: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/6.jpg)
6 mayo de 2010 Curso de programación en Java
Sintaxis
• Se apoya en – try {...}: Abarca el programa normal. Si todo va
bien será lo que ejecute. – throw exception: Cuando algo va mal nos
permite lanzar una excepción para indicarlo. – catch (class exception) {…}: Nos permite tratar
un tipo de excepción. Habrá un catch por cada tipo posible.
– finally {…} Siempre se ejecuta, va al final.
![Page 7: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/7.jpg)
7 mayo de 2010 Curso de programación en Java
Ejemplo try { // Codigo normal ... if (algo mal) throw excep; // Si fue mal esto no ejecutaria ...
} catch (ArithmeticException e){...} // Excp. Aritm catch (InputMismatchException e) // Excp. formato catch (MyException) {...} //”mis” excep. finally {...} // Siempre se ejecuta
• Este esquema puede repetir varias veces, consecutivas o en un bucle. Finalizado no debe haber errores por tratar
![Page 8: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/8.jpg)
8 mayo de 2010 Curso de programación en Java
Paso de Excepciones entre funciones (I)
• Si una función no captura una excepción está va a la función que la invocó, que saltará al “catch” correspondiente, así hasta el main
• Si ninguna la captura se da una terminación anómala
Exception in thread "main" java.lang.ArithmeticException: / by zero
![Page 9: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/9.jpg)
9 mayo de 2010 Curso de programación en Java
Paso de Excepciones entre funciones (II)
• Para indicar las excepciones que una función puede lanzar se ponen explicitamente: throws
int pop () throws EmptyStackException {...}
• Una función, dentro del catch, puede lanzar otra excepción (p.e. si no sabe tratar la 1ª)
• E incluso relanzar la misma: throw e;
![Page 10: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/10.jpg)
10 mayo de 2010 Curso de programación en Java
Definir excepciones • Hay algunas predefinidas:
– NoSuchFieldException, NoSuchMethodException, NullPointerException , IllegalArgumentException, ArrayIndexOutOfBoundsException, IOException, ClassNotFoundException
• Incluso podemos definir nuestras Excep. class EmptyStackException extends Exception { EmptyStackException(String s) { super(s); } }
![Page 11: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/11.jpg)
11 mayo de 2010 Curso de programación en Java
Errores
• Similar idea a las excepciones, pero son fallos que
no están pensados para capturarse y tratarse: – OutOfMemoryError, VirtualMachineError
• Se supone que son irrecuperables • En cambio todas las excepciones deberían
capturarse para salir de forma “limpia”
![Page 12: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/12.jpg)
12 mayo de 2010 Curso de programación en Java
Aserciones (I)
• Similar idea a las excepciones, pero son detectan fallos del programador.
• Toda función necesita que se cumplan unas premisas a la entrada (precondiciones) y deja el estado en un modo conocido (postcondiciones)
• Si no se cumplen algo ha ido mal • Se activan en desarrollo y depuración, para no
penalizar las ejecuciones “normales”: java –ea ejecutable
![Page 13: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/13.jpg)
13 mayo de 2010 Curso de programación en Java
Aserciones (II)
• No están pensadas para ser tratadas (generan un AssertionError)
• No se tratan porque al ser errores de programación no deberían darse y si se dan no está claro como recuperarse
assert(b!=0):“El divisor no puede ser cero";
• Genera: Exception in thread "main" AssertionError: El divisor no puede ser cero
![Page 14: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/14.jpg)
14 mayo de 2010 Curso de programación en Java
Genéricos o Prototipos
![Page 15: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/15.jpg)
15 mayo de 2010 Curso de programación en Java
Introducción (I) • Hay ciertos aspectos y características que son comunes
a muchas clases. • Por ejemplo, estructuras de datos (pilas, listas, colas,
árboles,...) o algoritmos (ordenar, invertir, sustituir) que pueden aplicarse a cualquier clase, no varía su significado.
• Podemos tener una pila de enteros, de platos, de strings o de coches.
• Podemos ordenar enteros, reales, complejos, strings,...
Templates
![Page 16: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/16.jpg)
16 mayo de 2010 Curso de programación en Java
Introducción (II) • Ejemplo: PILA. Definamos una pila de enteros:
Generics
![Page 17: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/17.jpg)
17 mayo de 2010 Curso de programación en Java
Introducción (III) • La idea es programarlo una vez y no volver a tener que
hacerlo • Aumenta la productividad ya que se reutiliza el código • Aumenta la calidad ya que se usa código “probado” • Permite centrarse en los aspectos importantes de
nuestro programa • Debería incrementar la velocidad, una única
implementación pero de calidad • ¡¡¡Otros ya lo han implementado por nosotros!!!
Generics
![Page 18: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/18.jpg)
18 mayo de 2010 Curso de programación en Java
Introducción (IV) • Además el compilador detecta errores que de otro
modo no podría: Código más legible y robusto • Sea una caja para guardar objetos en general: public class Box {
private Object object;
public void add(Object object)
{ this.object = object; }
public Object get()
{ return object; } }
Generics
![Page 19: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/19.jpg)
19 mayo de 2010 Curso de programación en Java
Introducción (V) • A la hora de usarla podemos tener problemas: // ONLY place Integer into this box! Box
integerBox = new Box(); // Cast???
Integer someInt =(Integer) integerBox.get();
// MAL!!!
integerBox.add("10"); // String!!!!
• Esta mal pero el compilador no lo dice y luego se generará una “java.lang.ClassCastException: “
Generics
![Page 20: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/20.jpg)
20 mayo de 2010 Curso de programación en Java
Generics (I) • Volvamos con la pila de enteros ¿Qué sucede si
ahora deseamos una pila de caracteres? • Necesitamos rehacer todo. Es absurdo. • Para esto están los prototipos o generics. Se
aplican a clases, constructores, métodos,... • Se deja el tipo a utilizar como un argumento que
luego se especificará. • No se genera una clase para cada nuevo tipo,
todas son la misma.
Generics
![Page 21: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/21.jpg)
21 mayo de 2010 Curso de programación en Java
Generics (II) // Sustituimos Object por T
public class Box<T> { private T t; // T is "Type" public void add(T t) { this.t = t; } public T get() { return t; } }
• T es un tipo “formal” que luego será sustituido por el tipo “real”. T se puede usar casi como cualquier tipo normal
Generics
![Page 22: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/22.jpg)
22 mayo de 2010 Curso de programación en Java
Generics (III) • A la hora de usarla se indica el tipo: Box<Integer> integerBox = new Box<Integer>();
• Beneficios claros: // Sin Cast!!!
Integer someInt = integerBox.get(); // El compilador nos avisa que está mal!!!
integerBox.add("10"); // String
• El compilador entiende que queremos hacer y nos da mejor soporte.
Generics
![Page 23: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/23.jpg)
23 mayo de 2010 Curso de programación en Java
Generics (IV) • Se pueden usar también argumentos de tipo en métodos y
constructores. En la clase Box: public <U> void inspect(U u){
System.out.println("T: " + t.getClass().getName());
System.out.println("U: " +
u.getClass().getName()); } • También se puede usar más de un argumento de tipo: T, U • Al usarlo: integerBox.inspect("some text"); T: java.lang.Integer
U: java.lang.String
Generics
![Page 24: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/24.jpg)
24 mayo de 2010 Curso de programación en Java
Generics (V) • Normalmente en mayúsculas (para distinguirlos de los
parámetros normales) y cortos (una letra): – E - Element – K - Key – N - Number – T - Type – V - Value – S,U,V etc. - 2nd, 3rd, 4th types
Generics
![Page 25: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/25.jpg)
25 mayo de 2010 Curso de programación en Java
Generics (VI) • También con métodos estáticos. En la clase Box: public static <U> void fillBoxes(U u, List<Box<U>> boxes) {
for (Box<U> box : boxes) { box.add(u); }
}
• Al usarlo: Crayon red = ...; List<Box<Crayon>> crayonBoxes = ...;
Box.<Crayon>fillBoxes(red, crayonBoxes);
Box.fillBoxes(red, crayonBoxes); // Es igual.
Generics
![Page 26: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/26.jpg)
26 mayo de 2010 Curso de programación en Java
Tipos acotados
• Para restringir el tipo de dato que se pueda usar (bounded type parameters) se usa extends seguido de un tipo (o interfaz) que marca el límite superior public <U extends Number> void inspect(U u) { …}
• U debe ser un subclase de Number, sino no compila. • Se pueden combinar varios:
<U extends Number & MyInterface>
Generics
![Page 27: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/27.jpg)
27 mayo de 2010 Curso de programación en Java
Subtipos
• Integer y Double son subtipos de Number, pero Box<Integer> y Box<Double> no de Box<Number>
Box<Number> b = new Box<Number>();
b.add(new Integer(10)); // OK
b.add(new Double(10.1)); // OK
public void boxEmpty(Box<Number> b){ … } Box.boxEmpty(new Box<Integer>()); //NO!!!
Box.boxEmpty(new Box<Double>()); //NO!!!
Generics
![Page 28: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/28.jpg)
28 mayo de 2010 Curso de programación en Java
Comodines (Wildcards)
• Para solucionar esto está los comodines “?”, que indica tipo desconocido. Se suele usar junto a modo acotado.
• Caja de tipo desconocido subtipo de Number: Box<? extends Number> b;
public void boxEmpty(Box<?> b){} //También!! b = new Box<Integer>(); //Si
Box.boxEmpty(new Box<String>()); // Si
b.add(new Integer()); // NO b tipo real desc.
Generics
![Page 29: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/29.jpg)
29 mayo de 2010 Curso de programación en Java
Borrado del tipo (I) • Como se ha dicho, no se genera un clase para cada
tipo, el compilador borra los argumentos de tipo y sólo hay una clase: Box<String> pasa a Box.
• No se puede saber el tipo de una clase genérica durante la ejecución (Box es de raw type).
if (item instanceof E) {…} // error
E item2 = new E(); // error
E[] iArray = new E[10]; // error
E obj = (E)new Object(); //Unchecked cast war
Generics
![Page 30: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/30.jpg)
30 mayo de 2010 Curso de programación en Java
Borrado del tipo (II) • Los raw types se pueden usar, pero generan warnings
ya que el compilador no puede chequear los tipos. • Es legal usarlo por compatibilidad con código antiguo • Si se usan mal generarán una excepción en tiempo de
ejecución • Al generar las clases genéricas una única clase, no se
puede usar el tipo formal en variables estáticas (debe haber una instancia para conocer el tipo real)
Generics
![Page 31: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/31.jpg)
31 mayo de 2010 Curso de programación en Java
Borrado del tipo (III) • Una solución para E item2 = new E(); es usar
literales de tipo clase. • Ahora java.lang.Class<T> es genérico y su
método newInstance() devuelve T public static <T> void select(Class<T> c, String sqlStatement){ for (/* Iterate over jdbc results. */ ) { T item = c.newInstance(); result.add(item); } return result; }
Generics
![Page 32: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/32.jpg)
32 mayo de 2010 Curso de programación en Java
Tipos Expandidos (I) • Hay casos en que queremos mitigar cierta restricción de tipos,
por ejemplo, para llamar a un método de una clase padre que admite algo menos restrictivo. Ejemplo sencillo:
interface Sink<T> { flush(T t); } public static <T> T writeAll(Collection<T> coll, Sink<T> snk) { T last; for (T t : coll) { last = t; snk.flush(last);
} return last; }
Generics
![Page 33: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/33.jpg)
33 mayo de 2010 Curso de programación en Java
Tipos Expandidos (II) Sink<Object> s;
Collection<String> cs;
String str = writeAll(cs, s); // Illegal • Tanto String como Object no encajan. Alternativa public static <T>
T writeAll(Collection<? extends T>, Sink<T>) {...} ...
// Call is OK, but wrong return type.
String str = writeAll(cs, s);
Generics
![Page 34: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/34.jpg)
34 mayo de 2010 Curso de programación en Java
Tipos Expandidos (III) • La solución es usar super. Es la inversa de extends, indica un
supertipo de otro, Sink<? super T> • Es decir, recibe algo que es supertipo de T. En este caso será un
Objeto, que es supertipo de String: public static <T>
T writeAll(Collection<T> coll, Sink<? super T> snk) { ... }
Sink<Object> s;
Collection<String> cs;
String str = writeAll(cs, s); // Yes!
Generics
![Page 35: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/35.jpg)
35 mayo de 2010 Curso de programación en Java
Colecciones (Biblioteca)
![Page 36: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/36.jpg)
36 mayo de 2010 Curso de programación en Java
Introducción (I) • Como ya se ha dicho, hay estructuras de datos (pilas,
listas, colas, árboles, hash,...) o algoritmos (ordenar, invertir, sustituir) que pueden aplicarse a muchas clases.
• Apoyándose en los generics, se ha construido en java una biblioteca de estructuras de datos y algoritmos, muy útil.
• ¡¡¡Otros ya lo han implementado por nosotros!!! • Las colecciones agrupan elementos (contenedores).
Permiten añadir, borrar y manipularlos fácilmente.
Collections
![Page 37: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/37.jpg)
37 mayo de 2010 Curso de programación en Java
Introducción (II) • Aumenta la productividad ya que se reutiliza el código • Aumenta la calidad ya que se usa código “probado” • Permite centrarse en los aspectos importantes de
nuestro programa • Aumenta la velocidad, una implementación de calidad • La biblioteca está formada por:
– Interfaces, que definen como debe comportarse un TAD – Implementaciones de estos interfaces – Algoritmo para trabajar con estos TAD
• Deben usarse los interfaces, sin entrar en detalles de la implementación concreta.
Collections
![Page 38: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/38.jpg)
38 mayo de 2010 Curso de programación en Java
Interfaces (I)
• Todos estos contenedores son genéricos, pueden trabajar con cualquier tipo de objeto:
List<String> listaNombres;
• Cada interfaz tiene varias implementaciones que le dan soporte, el usuario elige la que más le conviene.
• Debe usarse a través de la interfaz, no la implementación
Collections
![Page 39: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/39.jpg)
39 mayo de 2010 Curso de programación en Java
Collections (I) public interface Collection<E> extends Iterable<E> { // Basic operations (a nivel de elementos) int size(); boolean isEmpty(); boolean contains(Object element); boolean add(E element); boolean remove(Object element); Iterator<E> iterator(); // Bulk operations (a nivel de la Colección) boolean containsAll(Collection<?> c); boolean addAll(Collection<? extends E> c); boolean removeAll(Collection<?> c); boolean retainAll(Collection<?> c); void clear(); // Array operations Object[] toArray(); <T> T[] toArray(T[] a); }
Interfaces
![Page 40: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/40.jpg)
40 mayo de 2010 Curso de programación en Java
Collections (II) Interfaces
• Representan grupos de objetos o elementos • Si se modifica devuelve true, sino false. • Dos formas de recorrerlos:
– for-each – Iteradores:
public interface Iterator<E> { boolean hasNext(); E next(); void remove(); }
![Page 41: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/41.jpg)
41 mayo de 2010 Curso de programación en Java
Collections (III) Interfaces
• for-each for (Object o : collection)
System.out.println(o); • Iteradores: c colección de E’s for(Iterator<E>it=c.iterator();it.hasNext(); )
if (!cond(it.next()))
it.remove();
![Page 42: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/42.jpg)
42 mayo de 2010 Curso de programación en Java
Collections (IV) Interfaces
• Transformaciones a arrays para antiguas APIs Object[] a = c.toArray(); // c collection of Strings
String[] a = c.toArray(new String[0]);
![Page 43: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/43.jpg)
43 mayo de 2010 Curso de programación en Java
Set (I) Interfaces
• Representa Conjuntos. • No permite elementos duplicados • Mismos métodos que collection • Tres implementaciones de propósito general
– HashSet: rápido, no guarda el orden. La usual. – TreeSet: más lento, ordena los elementos – LinkedHashSet: guarda el orden en que se insertaron
• Permite operaciones de conjuntos: unión (addAll), intersección (retainAll), subconjuntos (containAll),…
![Page 44: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/44.jpg)
44 mayo de 2010 Curso de programación en Java
Set (II) Interfaces
• No usar la implementación: Set<String> uniques = new HashSet<String>();
Set<String> dups = new HashSet<String>();
for (String a : args)
if (!uniques.add(a))
dups.add(a);
// Destructive set-difference
uniques.removeAll(dups);
• Con cambiar HashSet por TreeSet ya estaría ordenado!!
![Page 45: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/45.jpg)
45 mayo de 2010 Curso de programación en Java
List (I) Interfaces
• Es una secuencia ordenada, admite elementos duplicados • Se puede acceder al elemento i-esimo (get y set) • Se puede insertar/borrar a una posición add/remove • Se puede buscar un elemento (indexOf) • Se pueden obtener sublistas • El iterador se ha mejorado y es bidireccional. El
constructor admite la posición en la que empezar • Dos implementaciones generales: ArrayList, LinkedList
![Page 46: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/46.jpg)
46 mayo de 2010 Curso de programación en Java
List (II) Interfaces
public interface List<E> extends Collection<E>{
// Positional access
E get(int index);
E set(int index, E element);
boolean add(E element); // añade al final
void add(int index, E element);
E remove(int index);
boolean addAll(int index,Collection<? extends E>c);
int indexOf(Object o); // Search
int lastIndexOf(Object o); // Search
ListIterator<E> listIterator(); // Iteration
ListIterator<E> listIterator(int index);//Iteration
// Range-view [from,to), from:incl, to:excl
List<E> subList(int from, int to); }
![Page 47: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/47.jpg)
47 mayo de 2010 Curso de programación en Java
ListIterator Interfaces
public interface ListIterator<E> extends Iterator<E> {
boolean hasNext();
E next();
boolean hasPrevious();
E previous();
int nextIndex();
int previousIndex();
void remove();
void set(E e);
void add(E e); }
![Page 48: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/48.jpg)
48 mayo de 2010 Curso de programación en Java
Queue (I) Interfaces
• Representan colas, por ejemplo, de trabajos (para la impresora, cpu o similar)
• Pueden ser FIFO o LIFO. Hay colas con prioridades. • Existen versiones que, en situaciones críticas, lanzan
excepciones o devuelven un valor especial, null, si pila vacía, llena: – Add-offer, remove-poll, element-peek
• Dos implementaciones generales: LinkedList, PriorityQueue
![Page 49: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/49.jpg)
49 mayo de 2010 Curso de programación en Java
Queue (II) Interfaces
public interface Queue<E> extends Collection<E> {
E element(); // no lo quita
boolean offer(E e); //add al final
E peek(); // no lo quita
E poll(); // remove al principio
E remove(); // remove al principio
}
![Page 50: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/50.jpg)
50 mayo de 2010 Curso de programación en Java
Map (I) Interfaces
• Asocia a cada clave un valor. No puede haber claves repetidas. Es un conjunto de parejas (clave, valor)
• Un ejemplo, un listín telefónico o una agenda • Tres implementaciones de propósito general:
– HashMap, TreeMap, LinkedHashMap, análogo a Set • El valor puede ser cualquier cosa, inclusa una lista: Map<String, List<String>> map =
new HashMap<String, List<String>>();
![Page 51: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/51.jpg)
51 mayo de 2010 Curso de programación en Java
Map (II) Interfaces
public interface Map<K,V> {// Basic operations
V put(K key, V value);
V get(Object key);
V remove(Object key);
boolean containsKey(Object key);
boolean containsValue(Object value);
int size();
boolean isEmpty();
// Bulk operations
void putAll(Map<? extends K, ? extends V> m);
void clear();
// Collection Views (muy potente!!!)
public Set<K> keySet();
public Collection<V> values();
public Set<Map.Entry<K,V>> entrySet(); }
![Page 52: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/52.jpg)
52 mayo de 2010 Curso de programación en Java
Map (III) Interfaces
// Interface for entrySet elements
public interface Entry {
K getKey();
V getValue();
V setValue(V value);
}
• Ejemplo for (KeyType key : map.keySet())
System.out.println(key);
for (Map.Entry<KeyType, ValType> e : m.entrySet()) System.out.println(e.getKey() + ": " + e.getValue());
![Page 53: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/53.jpg)
53 mayo de 2010 Curso de programación en Java
SortedSet (I) Interfaces
• Conjunto ordenado según un orden natural o el criterio que proporcione la clase de los objetos guardados
• Incluye subconjuntos (rangos), acceso al principio y final, al comparador. Los rangos son semi-abiertos
// Borrar palabras que empiezan por ‘f’
dictionary.subSet("f", "g").clear();
• Una implementación general: TreeSet
![Page 54: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/54.jpg)
54 mayo de 2010 Curso de programación en Java
SortedSet (II) Interfaces
public interface SortedSet<E> extends Set<E> {
// Range-view [from,to) from:incl, to:excl
SortedSet<E> subSet(E fromElement, E toElement);
SortedSet<E> headSet(E toElement);
SortedSet<E> tailSet(E fromElement);
// Endpoints
E first();
E last();
// Comparator access
Comparator<? super E> comparator();
}
![Page 55: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/55.jpg)
55 mayo de 2010 Curso de programación en Java
SortedMap (I) Interfaces
• Diccionario ordenado por las claves según un orden natural o el criterio que proporcione la clase de los objetos guardados
• Incluye subconjuntos (rangos), acceso al principio y final, al comparador. Los rangos son semi-abiertos
• Una implementación general: TreeMap
![Page 56: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/56.jpg)
56 mayo de 2010 Curso de programación en Java
SortedMap (II) Interfaces
public interface SortedMap<K, V> extends Map<K, V>{
Comparator<? super K> comparator();
SortedMap<K, V> subMap(K fromKey, K toKey);
SortedMap<K, V> headMap(K toKey);
SortedMap<K, V> tailMap(K fromKey);
K firstKey();
K lastKey();
}
![Page 57: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/57.jpg)
57 mayo de 2010 Curso de programación en Java
Orden (I) Interfaces
• Ciertas clases admiten un orden natural, como los números, los Strings, las fechas (Date), ficheros o los caracteres
• En otros casos debe definirse para cada clase. En personas puede ser según Apellidos y luego el nombre
• En empleados puede ser la fecha de contratación • Para usar SortedSet y SortedMap los objetos deben
poderse comparar, deben implementar Comparable y su único método compareTo(object o)
![Page 58: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/58.jpg)
58 mayo de 2010 Curso de programación en Java
Orden (II) Interfaces
• int compareTo(object o) compara el objeto recibido por parámetro y el actual y devuelve negativo, cero o positivo si el parámetro es menor, igual o mayor que el actual (debe establecer un Orden Total)
• Una alternativa a Comparable es Comparator<T> que tiene int compare(T obj1, T obj2) y funciona similar.
• Se usa para clases que no implementan Comparable • Se pasa al Sort: <T> void sort(List<T> list, Comparator<? super T> c)
![Page 59: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/59.jpg)
59 mayo de 2010 Curso de programación en Java
Introducción Implementaciones
• Existen múltiples implementaciones que proporcionan la funcionalidad de cada interfaz.
• La mayoría son generales, las hay especificas buscando características concretas. Y los usuarios pueden hacer las suyas a partir de implementaciones abstractas.
• Otras son sincronizadas para permitir concurrencia. • Otras son mini-implementaciones, muy eficientes. • No debe hacerse el programa dependiente de la
implementación elegida.
![Page 60: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/60.jpg)
60 mayo de 2010 Curso de programación en Java
Set Implementaciones
• Set: Generales: – HashSet: rápida, no guarda el orden. La usual. Crece según
necesidad. Se puede indicar tamaño inicial – TreeSet: más lenta, ordena los elementos – LinkedHashSet: guarda el orden en que se insertaron.
También se puede indicar tamaño inicial.
• Set: Específicas: – EnumSet: Para enumerados, muy eficiente (bit-vector) – CopyOnWriteArraySet: para conjuntos que se leen mucho y
se escriben raramente. Todas las operaciones de escritura se hacen copiandolo, seguro con alta concurrencia.
![Page 61: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/61.jpg)
61 mayo de 2010 Curso de programación en Java
List Implementaciones
• List: Generales: – ArrayList: rápida, tipo vector. Si inserta mucho al principio
o se borran elemento, va mal. Puede indicarse tamaño inicial – LinkedList: guarda el orden en que se insertaron.
Implementa también Queue. • List: Específicas:
– CopyOnWriteArraySet: para listas que se leen mucho y se escriben raramente. Todas las operaciones de escritura se hacen copiandolo, seguro con alta concurrencia.
– Si necesita concurrencia, usar Vector.
![Page 62: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/62.jpg)
62 mayo de 2010 Curso de programación en Java
Map Implementaciones
• Map: Generales: – HashMap: rápida, tipo vector. Si inserta mucho al principio o
se borran elemento, va mal. Puede indicarse tamaño inicial – TreeMap: es ordenado siguiendo la clave. – LinkedHashMap: guarda el orden de inserción o según la clave
• Map: Específicas: – EnumMap: Para claves enumeradas (es un array) – WeakHashMap. Guarda referencias ‘debiles’, (sólo si se usan) – IdentityHashMap. Se basa en “identidad” (objetos cambiantes). – ConcurrentHashMap. Para el interfaz ConcurrentMap
![Page 63: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/63.jpg)
63 mayo de 2010 Curso de programación en Java
Queue Implementaciones
• Queue: Generales: – LinkedList: rápida. – PriorityQueue: Colas con prioridad.
• Queue: Concurrentes, implementan BlockingQueue – LinkedBlockingQueue. FIFO y acotada, nodos enlazados – ArrayBlockingQueue. FIFO y acotada, un array – PriorityBlockingQueue. Cola basada en prioridades no acotada – DelayQueue. Cola de planificación basada en tiempo – SynchronousQueue
![Page 64: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/64.jpg)
64 mayo de 2010 Curso de programación en Java
Wrapper Implementations Implementaciones
• Añaden funcionalidad extra a ciertas implementaciones • Synchronization wrappers. Añaden sincronización. Para
Collection, Set, List, Queue, Map, SortedSet, SortedMap • Se crean: Map<KeyType, ValType> m = Collections.
synchronizedMap (new HashMap<KeyType, ValType>());
• Todos los accesos deben accerse a través de esa variable • Los iteradores deben protegerse (son varios accesos) Set<KeyType> s = m.keySet();
synchronized(m) { // Synchronizing on m, not s!
while (KeyType k : s) foo(k); }
• Unmodifiable wrappers, para sólo lecturas. Para Collection, Set, List, Queue, Map, SortedSet, SortedMap
![Page 65: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/65.jpg)
65 mayo de 2010 Curso de programación en Java
Mini Implementations Implementaciones
• Array.asList. Da una vista del array como una lista. No puede cambiar de tamaño. Para lista de tamaño fijo.
• Collections.nCopies. Una lista inmutable que contiene n copias de un mismo elmento. Para inicializaciones.
• Collections.singleton. Un conjunto con un único elemento • emptySet, emptyList y emptyMap de Collections. Vacías.
![Page 66: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/66.jpg)
66 mayo de 2010 Curso de programación en Java
Introducción Algoritmos
• Son métodos ‘estáticos’ y genéricos de Collections. • La mayoría operan sobre listas. • Sort. Ordena según orden natural o orden dado • Shuffle. Baraja, usa Random. • Manipulación de datos: reverse, fill, copy, swap, addAll • binarySearch. Búsqueda. • Sobre Collection: frecuency, disjoint, min, max
![Page 67: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/67.jpg)
67 mayo de 2010 Curso de programación en Java
Abstract Implementations Implementaciones
• Esqueletos de implementaciones para facilitar a los usuarios sus propias implementaciones.
• No suele ser necesario, siempre hay alguna implementación que nos viene bien.
• Posibles razones: – Implementar persistencia – Añadir funcionalidad – Específicas para ciertas aplicaciones
• Hay versiones abstractas de las seis interfaces • Basta con implementar los métodos abstractos. Fácil.
![Page 68: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/68.jpg)
68 mayo de 2010 Curso de programación en Java
Concurrencia (Threads)
![Page 69: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/69.jpg)
69 mayo de 2010 Curso de programación en Java
Introducción • Los computadores hacen varias cosas a la vez
– Navegador, editores, procesador de textos, hojas de cálculo, compilador,…
• Hoy en día, con varios núcleos, más aún. • Cada ejecución de un programa es un proceso • Un proceso es autocontenido, con todos los recursos
que necesita para poder ejecutar. • Los procesos pueden cooperar usando IPC • Java permite lanzar nuevos procesos (ProcessBuilder)
Concurrencia
![Page 70: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/70.jpg)
70 mayo de 2010 Curso de programación en Java
Threads (I) • Un proceso puede tener varios threads • Estos threads comparten los recursos del proceso
(memoria, ficheros,…), son más ligeros y eficientes • Java permite lanzar nuevos threads. Dos vías:
– Implementar Runnable y su método Run: (new Thread(new ClassRunnable())).start(); – Extender Thread (también Run): (new ClassThread()).start();
• Además de crearlo debe lanzarse (start)
Concurrencia
![Page 71: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/71.jpg)
71 mayo de 2010 Curso de programación en Java
Threads (II) • Extender Thread es más sencillo y proporciona
métodos para conocer y manipular el thread, pero no puede heredar de otra clase.
• Runnable es más flexible y permite además heredar de otra clase. Permite separar la tarea a realizar del thread que lo realizará
• Al usar Thread surgen posible Excepciones
Concurrencia
![Page 72: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/72.jpg)
72 mayo de 2010 Curso de programación en Java
Funcionalidad de Threads • sleep() nos permite suspende un thread (miliseg) • Puede ser interrumpido por otro, interrupt() • Se genera una Excepción (InterruptedException) • Esa interrupción le indica que deje de hacer
‘algo’ para pasar a hacer otra cosa. • Si no estaba suspendido puede preguntar por
interrupted() para saber si alguien le interrumpió • Se puede esperar por un thread, join().
Concurrencia
![Page 73: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/73.jpg)
73 mayo de 2010 Curso de programación en Java
Sincronización (I) • Los threads se comunican fácilmente, comparten
toda la información (ven la misma memoria) • Pueden surgir problemas si no se coordinan al
acceder a la información: Errores • Dos leen una variable A, la incrementan y la
guardan. ¡¡¡Solo se ha incrementado en UNO!!! • Java proporciona synchronized para evitarlo • Cada objeto (y clase) tiene una “llave” o lock
Concurrencia
![Page 74: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/74.jpg)
74 mayo de 2010 Curso de programación en Java
Sincronización (II) • Una clase puede tener métodos sincronizados synchronized void metodo1() { …} synchronized void metodo2() { …}
• No se pueden ejecutar a la vez invocaciones a métodos sincronizados de un mismo objeto
• Si un thread ya está actualizando este objeto, cualquier otro thread deberá esperar a que termine el método que está ejecutando para poder ejecutar otro método sincronizado
• Se implementa con cerrojos (lock) en cada objeto
Concurrencia
![Page 75: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/75.jpg)
75 mayo de 2010 Curso de programación en Java
Sincronización (III) • Un thread debe adquirir este cerrojo para modificar el
objeto y lo liberar al final. • Mientras nadie puede coger el cerrojo, esperan. • Se pueden sincronizar sentencias: synchronized(this) {…} // especifica el obj.
• Un thread puede adquirir un cerrojo que ya tiene, puede llamar a otros métodos sincronizados.
• Si un thread 1 intentar adquirir el cerrojo de un objeto B desde un objeto A y otro thread 2 intenta adquirir el cerrojo de A desde B, se produce un interbloqueo.
Concurrencia
![Page 76: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/76.jpg)
76 mayo de 2010 Curso de programación en Java
Coordinación • A veces un thread debe esperar que otro calcule algo: while (!data.isReady()) { “nada”; }
• La cpu está ocupada para nada!!!! • Se puede decir que espere (wait). Libera la cpu. while (!data.isReady()) { wait(); } • La espera puede ser interrumpida • El otro thread le avisa con notify() o notifyAll() • Se debe usar en métodos sincronizados. Libera el
cerrojo y luego lo vuelve a coger para examinar la condición.
Concurrencia
![Page 77: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/77.jpg)
77 mayo de 2010 Curso de programación en Java
Cerrojos (intefaz lock) • Se pueden crear y manipular directamente. • Solo un thread puede tener un cerrojo • Tiene una condition asociada para soportar wait,
notify y notifyAll • Tiene: lock(), unlock() y tryLock()
– Lock: coger la llave – Unlock: dejar la llave – Trylock: Si puedo cojo la llave, si no hago otra cosa
Concurrencia
![Page 78: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/78.jpg)
78 mayo de 2010 Curso de programación en Java
Ejecutores (intefaz Executor) • Separan la tarea (task) a hacer del thread. • (new Thread(r)).start(); pasa a e.execute(r); • Si hay threads disponibles pone a ejecutar “r” (no
crea el thread). Si no los hay, pone “r” como una tarea pendiente de ejecutar.
• Con ExecutorService submit(), además de Runnable admite Callable (devuelve un valor)
• Con ScheduledExecutorService se añade la posibilidad de indicar cuando ejecutará
Concurrencia
![Page 79: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/79.jpg)
79 mayo de 2010 Curso de programación en Java
Listas de threads (pool) • Da la opción de reutilizar los threads. Cuando
acaban no se destruyen, se dejan por si luego hay una tarea que necesita ser ejecutada. Más rápido
• Limita los recursos consumidos. • Los hay con un número de threads fijo
(newFixedThreadPool), variable (newCachedThreadPool) o una tarea cada vez (newSingleThreadExecutor)
Concurrencia
![Page 80: Curso de Programación en Java - Laboratorio SS.OO ...laurel.datsi.fi.upm.es/_media/docencia/cursos/java/java.pdf · mayo de 2010 Curso de programación en Java 2 Índice ... •](https://reader034.vdocuments.site/reader034/viewer/2022052516/5bb75ab009d3f2a4338d36df/html5/thumbnails/80.jpg)
80 mayo de 2010 Curso de programación en Java
Sincronización adicional • Bastante estructuras de datos de Collections
tienen implementaciones concurrentes: BlockingQueue, ConcurrentMap, ConcurrentNavigableMap
• Para facilitar el acceso a variable compartidas están los Atomic: AtomicInteger, AtomicBoolean, AtomicLong, AtomicReference
Concurrencia