Académique Documents
Professionnel Documents
Culture Documents
Un poco de historia
Arquitectura de la plataforma J2SE
Cambios en la JVM
UN POCO DE HISTORIA
Genéricos (Generics)
Bucle for mejorado
Autoboxing / Unboxing
Anotaciones (Annotations)
ARQUITECTURA DE LA PLATAFORMA J2SE
JRE Y JDK
En JDK 6.0:
DTtrace Probes
Parallel Compaction
En JDK 5.0:
Class Data Sharing
Otras mejoras
Fuente:http://java.sun.com/javase/6/docs/technotes/guides/vm/index.html
Mejoras en JDK 5.0
CAMBIOS EN JAVA VIRTUAL MACHINE
Ventajas
- Disminución del tiempo de arranque de la máquina virtual.
- Al compartir todas las instancias el mismo archivo eliminamos la duplicidad que existía antes al
tener que cargar todas las clases por instancia de máquina virtual.
Inconvenientes
- No soportado en Windows 95/98/ME
- Solo disponible en VM Client
- Solo disponible con el Garbage Collector de serie
Fuente:http://java.sun.com/javase/6/docs/technotes/guides/vm/class-data-sharing.html
Mejoras en JDK 5.0
http://java.sun.com/javase/6/docs/technotes/guides/vm/server-class.html
Mejoras en JDK 5.0
Con esto se evita el ajuste manual por línea de comandos que se necesitaba hasta ahora.
Mejoras en JDK 5.0
CAMBIOS EN JAVA VIRTUAL MACHINE
http://forums.sun.com/thread.jspa?forumID=31&threadID=550529
http://www.javaworld.com/javaworld/jw-09-1998/jw-09-threads_p.html
Otras mejoras
El mecanismo de aviso de errores fatales ha mejorado en el diagnóstico y fiabilidad.
Soporte de granularidad de nanosegundos para mediciones de tiempos (dependiente
de plataforma).
Mejoras en JDK 6.0
DTrace Probes
Es una herramienta de instrumentación desarrollada por Sun en el 2005 y disponible en Solaris
10. DTrace está formado por una serie de elementos, el uso de los cuales nos permiten
medir, controlar, registrar, etc. variables del sistema. Cuando utilicemos DTrace debes pensar
(la misma nomenclatura de DTrace nos lleva a ello) que estamos poniendo sondas en el
sistema que están recogiendo datos para nosotros.
Está orientada tanto para desarrolladores, a los cuales puede ayudar en las distintas fases de
desarrollo, midiendo variables del sistema, de la misma forma que ocurriría en un sistema
en producción.
Mas información:
Solaris Dynamic Tracing Guide:
http://docs.sun.com/app/docs/doc/819-3620
Fuente: http://java.sun.com/performance/reference/whitepapers/6_performance.html
2.Fundamentos del lenguaje
OBJETIVOS DE LA UNIDAD
Uso de Genéricos
Constructores
Double (double value) y Double(String value)
enviarEmail("Saludo","pepe@dominio.com","juan@dominio.com");
Definición
Las anotaciones permiten asociar información, en forma de pares atributo-valor
(miembros), a los elementos de programación (paquetes, tipos, métodos,
constructores, campos, parámetros y variables locales).
Las anotaciones son meta información (información sobre el código).
Un tipo de anotación (annotation type) es a una anotación lo que a un objeto es
su clase.
Se define como una interfaz especial con restricciones y diferente sintaxis, se
verá su definición más adelante.
METADATA Y ANOTACIONES
Uso de anotaciones
Sintaxis
@TipoAnotacion(nombre1=valor1,nombre2=valor2,...)
El orden de los pares no es importante. Si un miembro tiene valor
por defecto no es obligatoria su presencia.
Uso de anotaciones
Sintaxis (continuación)
Si el tipo tiene un único miembro y tiene de nombre value, podría suprimirse el nombre y
el símbolo =.
@TipoAnotacion(valor)
Si además sólo se quiere pasar un valor en el array no son necesarias las llaves.
@TipoAnotacion(....,nombren=subvalor,...)
Los valores tienen que coincidir con el tipo del miembro declarado en su definición.
METADATA Y ANOTACIONES
Uso de anotaciones
Colocación
Se colocan justo antes de los modificadores de los elementos del lenguaje, normalmente en la
línea anterior a la del elemento.
Un caso especial son los paquetes, que como no son declarados en ningún sitio, es necesario para
asignarles una anotación, crear un fichero llamado package-info.java donde se declara el
paquete y se antepone la anotación.
También hay que apuntar que los valores enumerados, a pesar de no tener modificadores, pueden
ser anotados normalmente.
Anotaciones Estándar
Forman parte del paquete java.lang y son evaluadas por el compilador.
@Override
Avisa al compilador que el método al que acompaña sobrescribe un método de la
superclase. Aviso en tiempo de compilación por parte del compilador.
Ej:
@Override
public String toString() {
....
METADATA Y ANOTACIONES
Anotaciones Estándar
@Deprecated
Avisa al compilador de que un elemento es obsoleto, que se desaconseja su uso. De la misma
forma que lo hace la etiqueta @deprecated a la herramienta javadoc. El compilador lanzará un
warning, cuando se esté usando un elemento obsoleto en código no obsoleto.
Deprecated es una anotación marcador y se puede aplicar a cualquier elemento.
Ej:
@Deprecated
public enum FormatoAudio {..}
METADATA Y ANOTACIONES
Anotaciones Estándar
@SupressWarnings
Tipo de anotación que indica al compilador qué tipo de warnings no debe lanzar de las
generadas en el elemento anotado.
Se utiliza cuando el programador es consciente de que esta haciendo una práctica
desaconsejada pero por circunstancias es necesario, de esta forma en una zona
determinada del código se deshabilita al compilador para generar warnings de un tipo.
SuppressWarnings tiene un miembro cuyo tipo es un array de Strings, que contendrá los
identificadores de los warnings que se quieren evitar. Actualmente los identificadores no
están especificados por lo que se depende de la implementación del compilador. Algunos
implementados son: all, deprecation, checked, fallthrough, path, serial, finally.
Se puede aplicar a casi todos los elementos: tipos, campos, métodos, parámetros,
constructores y variables locales.
METADATA Y ANOTACIONES
Anotaciones Estándar
@SupressWarnings
Ej: Array de elementos
@SuppressWarnings({"checked","finally"})
public enum FormatoAudio {..}
Creación de anotaciones
Un tipo de anotación es una interfaz especial. Se define con la palabra clave @interface, que
implícitamente extiende la interfaz java.lang.annotation.Annotation.
Si se extiende manualmente no se crea un tipo de anotación.
Los miembros del tipo se definen como métodos sin parámetros, donde:
- Nombre del miembro es nombre del método.
- Tipo del miembro es tipo de retorno del método (primitivo, String, Class, un tipo
enumerado, un tipo de anotación o un array simple de un tipo de los anteriores).
Creación de anotaciones
Meta-anotaciones
Son anotaciones aplicables a anotaciones que se
pueden usar en la definición de la anotación
para caracterizarlas.
Java 5.0 define cuatro meta-anotaciones
estándar dentro del paquete
java.lang.annotation:
- Target
- Retention
METADATA Y ANOTACIONES
Meta-anotaciones
Target
Meta-anotación que especifica los elementos "objetivo" del tipo de anotación
que está siendo definida. O sea los elementos del lenguaje que pueden ser
anotados por el tipo.
Si un tipo de anotación no tiene la meta-anotación Target, esta puede ser
usada en cualquier elemento del lenguaje.
Target tiene un único miembro de nombre value y de tipo
java.lang.annotation.ElementType[] , un array de un tipo enumerado que
representa los elementos del lenguaje.
METADATA Y ANOTACIONES
Meta-anotaciones
Retention
Especifica el alcance del tipo de anotación que está siendo definida. Tiene un único miembro
llamado value, de tipo java.lang.annotation.RetentionPolicy con estos valores posibles:
SOURCE La anotación sólo existe en el código fuente, no pasa a la clase compilada.
Meta-anotaciones
Documented
Especifica que el tipo de anotación definida debe formar parte de la
documentación generada por herramientas como javadoc.
Documented es una anotación marcador, no tiene miembros.
Inherited
Inherited es una anotación marcador que especifica que el tipo de anotación
definido es heredado.
Quiere decir que la anotación aplicada a una clase se aplicará también a sus
subclases.
METADATA Y ANOTACIONES
Ejemplo
package java.lang;
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
METADATA Y ANOTACIONES
Por tanto:
Compilador realiza el casting.
Asegura que este se produce correctamente.
Ahorro de esfuerzos en desarrollo y depuración
USO DE GENÉRICOS (GENERICS)
2) Uso de tipos genéricos
Sin genéricos:
List lista= new LinkedList();
lista.add("Hola");
String elemento= (String)lista.get(0);
Con genéricos:
List<String> listaDeStrings= new LinkedList<String>();
listaDeStrings.add("Hola");
String elemento= listaDeStrings.get(0);
USO DE GENÉRICOS (GENERICS)
2) Uso de tipos genéricos
Con genéricos:
Map<String,List<Map<String,int[]>>> estructuraCompleja = new
HashMap<String,List<Map<String,int[]>>>();
int i= estructuraCompleja.get(clave1).get(0).get(clave2)[0];
Sin genéricos:
int i=
((int[])((Map)((List)estructuraCompleja.get(clave1)).get(0)).get(clave2))[0];
USO DE GENÉRICOS (GENERICS)
3) Aspectos avanzados
Veremos cuestiones relativas al uso de genéricos.
Raw Types
Nos permite instanciar objetos del API Collection
objetos sin necesidad de indicar su tipo.
Permite la compatibilidad hacia versiones
anteriores.
No existe mucha justificación en el uso de Raw
Types en código nuevo de Java 5.
USO DE GENÉRICOS
3) Aspectos avanzados
(GENERICS)
Jerarquía de tipos
La jerarquía de los tipos genéricos es
independiente de la jerarquía de sus tipos
parametrizados.
Jerarquía de tipos
Un ejemplo: ¿Son correctas estas líneas de código?
List<String> ls = new ArrayList<String>(); //1
List<Object> lo = ls; //2
Los métodos genéricos son métodos que tienen declaradas sus propias variables de tipo.
El ejemplo típico son los métodos estáticos, que por su naturaleza estática, no pueden acceder a las variables de
tipo declaradas en su clase, pero sí pueden tener sus propias variables de tipo.
Definición
modificadoresMetodo <A,B,..> TipoRetorno nombreMetodo(arg1,arg2,..)
USO DE GENÉRICOS
4) Métodos genéricos
(GENERICS)
Ejemplo:
public static <N extends Number> Pila<N> mayorSumatorio(Pila<N> p1, Pila<N> p2) {
Pila<N> pilaResultado= null;
if (sumatorio(p1) > sumatorio(p2)) pilaResultado= p1;
else if (sumatorio(p1) < sumatorio(p2)) pilaResultado= p2;
return pilaResultado;
}
Uso:
Pila<Double> p1= new Pila<Double>();p1.aniadir(111.2);
Pila<Double> p2= new Pila<Double>();p2.aniadir(2.2);
Pila<Double> p3= Pila.mayorSumatorio(p,p2);
El compilador deduce que el tipo parametrizado es Double, por lo que no es necesario ponerlo, aunque tampoco
sería incorrecto:
Pila<Double> p3= Pila.<Double>mayorSumatorio(p,p2);
USO DE GENÉRICOS (GENERICS)
5) Excepciones parametrizadas
En resumen:
Ejercicio:
Hasta ahora:
Integer iObject= new Integer(1); // boxing
int i= iObject.intValue(); // unboxing
Con autoboxing:
Integer iObject= 1; // auto-boxing
int i= iObject; // auto-unboxing
BOXING Y
Implicaciones
UNBOXING
Integer iObject= 0;
Integer iObject1= 1;
Integer iObject2= iObject+iObject1;
iObject2++;
4. Resolución de métodos
Cuando hay sobrecarga de métodos la resolución se basa en los argumentos, pero con la aparición del
autoboxing se pueden dar casos de ambigüedad.
Ejemplo:
public static void nombreMetodo(int i)
public static void nombreMetodo(Integer iObjeto)
// LLamada al metodo, no se aplica autoboxing
NombreClase.nombreMetodo(1);
Ejemplo:
public static void nombreMetodo(Integer iObjeto)
// LLamada al metodo con autoboxing
NombreClase.nombreMetodo(1);
String
Una de las clases mas importantes. Sus características mas importantes son:
1.- Implementa el patrón de diseño inmutable que indica que un objeto no puede ser
modificado, por tanto, al modificar cadenas realmente se están creando objetos
nuevos.
String s1 = “bienvenido”;
s1.concat(“ amigo”);
System.out.println(s1); ¿Salida por pantalla?
Está diseñada para manejar cadenas de caracteres que deban cambiar varias veces durante
la ejecución de un programa. Todas las modificaciones quedan dentro del mismo objeto.
Es una clase sincronizada.
Diferencias:
StringBuffer sb = new StringBuffer(“hola”);
sb.append(“ caballero”);
String st =“hola”;
st +=“ caballero”; //st = st.concat(“caballero”);
protected Miembro es accesible dentro del Puede ser accedido por métodos de Puede ser accedido por
mismo paquete y dentro de una la misma clase o de una métodos de la misma
subclase. subclase. clase o de una subclase.
Blank Miembro solo acceso dentro del Solo acceso por métodos dentro del Solo acceso por métodos
(friendly) mismo paquete mismo paquete solamente. dentro del mismo
paquete solamente.
private Miembro solo es accesible desde la Solo acceso por métodos de la Solo acceso por métodos de
clase que lo define misma clase la misma clase
MODIFICADORES EN JAVA
Modificadores de comportamiento
static Utilizado para declarar No necesario instanciar clase para su Solo existe una por instancia
clase de nivel superior llamada. por máquina virtual.
en contraposición a una NombreClase.nombreMétodo.
clase interna (inner- Solo acceso a variables static
class)
final La clase no puede utilizarse Método no puede ser sobreescrito. El valor no puede ser
en herencia (extends) modificado. CONCEPTO
DE CONSTANTE.
1. Bloque Static
Se ejecuta la primera vez que se crea un objeto de una clase o se llama a uno de
sus métodos static.
static{
//Instrucciones
}
2. Bloque Synchronized
Bloquea el trozo de código situado en su interior permitiendo que un solo hilo
simultáneamente lo ejecute.
synchronized(this){
//Sección crítica
}
MODIFICADORES EN JAVA
Reglas
1. La declaración de un método puede contener uno de los modificadores de acceso:
public, protected y private.
2. Las clases no pueden declararse como abstract y final simultáneamente.
3. Los métodos abstract no pueden declararse como private, static, final, native, strictfp o
synchronized.
4. Los métodos no pueden declararse como native y strictfp simultáneamente.
5. Los métodos abstract y native no tienen cuerpo:
abstract void method();
native void method();
6. Una clase que contiene métodos abstract debe ser declarada abstract
7. Campos final no pueden ser volatile
USO DEL NUEVO BUCLE FOR (FOREACH)
Ejercicios:
Definir
una estructura de datos de tipo pila que
pueda recorrerse mediante un bucle foreach
TIPOS DE RETORNO DE DATOS Y
PROMOCIÓN DIRECTA
En Java existe una serie de reglas para el retorno de valores en los métodos.
Uso de assertions
Uso de estructuras enum
Expresiones regulares
EnumMap y EnumSet son implementaciones de las interfaces Map y Set que aprovechan la particularidad
de los tipos enumerados para conseguir más eficiencia y compactación.
EnumMap
EnumMap es una implementación de la interfaz Map donde el tipo de las claves del mapa es
un enumerado. La implementación aprovecha el conocimiento del número de valores
posibles del tipo enumerado, resultando muy rápida y compacta.
Ejemplo de creación:
Map<NotasMusicales,String> mapaNotas= new
EnumMap<NotasMusicales,String>(NotasMusicales.class);
USO DE ESTRUCTURAS ENUM
Nuevas estructuras de datos: EnumMap y EnumSet
EnumSet
EnumSet es una clase que implementa la interfaz Set donde el tipo de los elementos del
conjunto es un tipo enumerado. La implementación aprovecha el conocimiento sobre el
tipo enumerado, para representar internamente el conjunto como un vector de bits,
consiguiendo una gran eficiencia.
Además de implementar la interfaz Set, la clase define una larga serie de "constructores"
estáticos, que dan una gran flexibilidad a la hora de crear conjuntos.
Ejemplo de creación:
Set<NotasMusicales> conjNotas= EnumSet.allOf(NotasMusicales.class);
USO DE ESTRUCTURAS
Sintaxis avanzada
ENUM
Formatter
Se ha añadido un intérprete para el formateo de texto al estilo printf del lenguaje C.
La sintaxis es muy parecida aunque tiene algunas peculiaridades propias de
Java.
La clase principal es java.util.Formatter. Una interfaz muy relacionada es
Appendable.
Para hacer más sencilla la programación se ha dotado a clases como
java.io.PrintStream, java.io.PrintWriter, String, de los métodos:
format(String format, Object... args)
format(Locale l, String format, Object... args)
para acceder al formateo directamente, sin tener que crear un objeto
java.util.Formatter.
USO DE PRINTF Y FORMAT
Formatter
Sintaxis:
%[argument_index$][flags][width][.precision]conversion
Formatter
Ejemplo:
Fechas
Calendar c = new GregorianCalendar(1995, MAY, 23);
String s = String.format("Duke's Birthday: %1$tb %1$te,%1$tY", c);
// -> s == "Duke's Birthday: May 23, 1995"
System.out.println(s);
//Otra forma.
System.out.printf("Duke's Birthday2: %1$tb %1$te,%1$tY \n", c);
EXPRESIONES REGULARES
Pattern (java.util.regex.Pattern )
Matcher matcher(CharSequence input): Realizará el tratamiento del patrón sobre el texto que
se le pase como entrada.
static boolean matches(String regex, CharSequence input): La utilidad de este método es que
permite la no utilización de un matcher para indicar si una expresión regular puede albergar
una cadena o parte de esta.
String pattern(): Devuelve la expresión regular asociada al objeto Pattern sobre el que estemos
trabajando.
String [] split (CharSequence input): Dado un patrón, crea un array de String con las diferentes
cadenas en las que se ha dividido.
EXPRESIONES REGULARES
Matcher (java.util.regex.Matcher)
Una vez definido el patrón con Pattern, tenemos
que crear un objeto que al recibir una cadena
de caracteres analice si dicha cadena, o las
subcadenas que la componen, pertenecen al
lenguaje dado.
EXPRESIONES REGULARES
Matcher (java.util.regex.Matcher)
int end(int group)
Devuelve el índice del último carácter más 1 de la cadena que concuerda con la expresión regular.
boolean find()
Busca en la cadena de texto a analizar a partir del último matching, la secuencia de caracteres que puede
concordar con la expresión regular.
boolean find(int start)
Lo mismo que find() , pero empieza a buscar a partir de un índice que le es dado como parámetro.
Pattern pattern()
Devuelve el Pattern sobre el que estamos trabajando.
String replaceAll(Strip cad)
Devuelve una cadena que es la alteración de la cadena original a evaluar de forma que se han sustituido
todas subsecuencias de caracteres que coincidían con la expresión regular por la cadena “cad” pasada
por parámetro.
int start()
El Matcher empieza a analizar en busca de una cadena de caracteres que concuerde con el patrón. (VER
EJEMPLOS)
USO DE SPLIT Y SCANNER
StringTokenizer
Existe desde la versión 1.0. Permite partir una cadena en tokens en función de un delimitador.
Constructores
StringTokenizer(String str)
StringTokenizer(String str, String delim)
StringTokenizer(String str, String delim, boolean returnDelims)
Métodos importantes
int countTokens();
boolean hasMoreElements();
boolean hasMoreTokens();
Object nextElement();
USO DE SPLIT Y SCANNER
Split
Método dentro de la clase String que divide
una cadena en función de una expresión
regular.
Si no encuentra concordancia con el patrón
devuelve un array con la misma cadena en su
primera posición.
Sintaxis:
USO DE SPLIT Y SCANNER
Split
String [] split(String regex,int limit)
limit: Controla el número de veces que se aplica el patrón a la cadena. Además afecta a la longitud
del array resultante.
Si limit > 0: El patrón se aplica como máximo n-1 veces. El array no será mayor de limit.
Si limit < 0: El patrón se aplica tantas veces como sea posible y no afecta a la longitud del array.
Si limit = 0: El patrón se aplica tantas veces como sea posible, no afecta a la longitud del array y,
además, se eliminan todas las cadenas vacías.
Split
Ejemplo: cadena = “boo:and:foo”
Regex Limit Result
: 2 { "boo", "and:foo" }
: 5 { "boo", "and", "foo" }
: -2 { "boo", "and", "foo" }
o 5 { "b", "", ":and:f", "", "" }
o -2 { "b", "", ":and:f", "", "" }
o 0 { "b", "", ":and:f" }
USO DE SPLIT Y SCANNER
Scanner (java.util.Scanner)
Nueva clase de Java 5.0 que es capaz de
escanear un texto y extraer tipos primitivos o
Strings siguiendo una expresión regular como
delimitador.
Interfaces
Fue introducido en la versión 1.2. Estas son las interfaces mas importantes:
Interface Collection
Representa un conjunto de objetos de una manera generalizada. Esta interfaz define una serie de métodos que serán los que el
resto de interfaces, o clases que nosotros realicemos, deban implementar :
Métodos para agregar y eliminar elementos
boolean add(Object element)
boolean remove(Object element)
Métodos para realizar consultas
int size()
boolean isEmpty()
boolean contains(Object element)
Métodos para recorrer todos los elementos
Iterator iterator()
Métodos para realizar varias operaciones simultáneamente
boolean containsAll(Collection collection)
boolean addAll(Collection collection)
void clear()
void removeAll(Collection collection)
void retainAll(Collection collection)
COLLECTIONS
Interface List
Esta interfaz define un conjunto de datos ordenados permitiendo elementos duplicados.
Añade operaciones a nivel de índice de los elementos así como la posibilidad de
trabajar con una parte de la totalidad de la lista.
Métodos que nos permiten acceder a elementos por su posición :
void add(int index, Object element)
boolean addAll(int index, Collection collection)
Object get(int index)
int indexOf(Object object)
int lastIndexOf(Object object)
Object remove(int index)
Object set(int index, Object element)
COLLECTIONS
Interface List
También disponemos de métodos que nos permiten trabajar con una parte de la lista :
ListIterator listIterator()
ListIterator listIterator(int comiento)
List sublist(int inicio, int fin)
Interface List
Dispone de 2 implementaciones:
- ArrayList: Representado mediante un array.
- LinkedList: Representado mediante una lista
doblemente enlazada.
COLLECTIONS
ArrayList
Sus características son:
- Sus métodos no son sincronizados (podremos sincronizarla a posteriori).
- Internamente implementa un array de 10 elementos por defecto.
Al aumentar el tamaño del array hay que redimensionarlo y mover todos los elementos a
partir de la posición donde vamos a insertar.
Estructura ideal si vamos a acceder a los elementos por su posición.
Optimización:
Insertar elementos siempre que sea posible al final de la lista.
COLLECTIONS
LinkedList
Sus características son:
- Sus métodos no son sincronizados (podremos sincronizarla a posteriori).
- Internamente implementa una lista enlazada:
1. Búsquedas mas costosas
Interface Set
Representa un conjunto de datos en el más puro estilo matemático, es decir, no se
admiten duplicados. Por lo tanto si añadimos un elemento a un conjunto y ese
elemento ya se encontraba en su interior no se producirá ningún cambio en la
estructura de datos.
Interface Set
Dispone de 2 implementaciones:
- HashSet: Representado mediante un HashMap.
- TreeSet: Representado mediante un TreeMap.
COLLECTIONS
HashSet
Implementa el conjunto de datos utilizando un tabla hash (HashMap).
Los elementos dentro de la interfaz no están ordenados y pueden variar su posición a lo
largo del tiempo a medida que se vayan haciendo operaciones de balanceo en la
estructura.
TreeSet
Esta implementación utiliza un TreeMap para almacenar los objetos. Los objetos se
guardan ordenados, en orden ascendente, según el orden natural de los objetos o
según el orden del comparador que le pasemos en el constructor.
Interface Map
Por definición, la interfaz define una estructura de datos que mapeará claves con valores sin permitir claves duplicadas. Tenemos
varios tipos de métodos :
Modificación
Object put(Object clave, Object valor)
void putAll(Map mapa)
void clear()
Object remove(Object clave)
Consulta
Object get(Object clave)
boolean containsKey(Object key)
boolean containsValue(Object value)
int size()
boolean isEmpty()
Vista
Set keySet()
Collection values()
Set entrySet()
COLLECTIONS
Interface Map
- Set keySet(): devuelve conjunto de datos (Set) con todas las claves
(únicas).
- Collection values(): devuelve conjunto de valores (no únicos)
- Set entrySet(): devuelve conjunto de elementos que implementan
interfaz Map.Entry que representa una pareja clave-valor. Podemos
modificar los valores mediante setValue().
Interface Map
Dispone de 2 implementaciones:
- HashMap: Representado mediante un HashMap
(sin ordenación). Permite “null” en clave y valores.
- TreeMap: Representado mediante un TreeMap
(ordenación natural o mediante comparador).
COLLECTIONS
HashMap
Implementa el conjunto de datos utilizando un tabla hash (HashMap).
Tiene dos parámetros que afectan a su rendimiento :
- capacidad inicial: Capacidad de la tabla cuando es creada(16 por defecto).
- factor de carga: porcentaje de tabla que puede estar lleno (75% por
defecto). Si se llega a este porcentaje se produce rehash
COLLECTIONS
TreeMap
La implementación de esta clase ordena los elementos por orden ascendente
de clave ya sea el orden natural de los objetos o el orden establecido por el
comparador que le pasemos en el constructor.
HashTable vs HashMap
HashTable es sincronizada mientras que HashMap no.
HashTable vs ConcurrentHashMap
Mismo tipo de estructura. ConcurrentHashMap no se bloquea en operaciones de
recuperación de datos.
Vector vs ArrayList
Vector es sincronizada mientras que ArrayList no.
Algoritmos de ordenación
- Interface Comparable
Elementos de colección con orden determinado. Deberemos sobrescribir
el método:
public int compareTo(Object o)
- Clase Collator
Ordenación de caracteres
- Interfaz Comparator
Modificación de la clase Comparable o añadir ordenación a una clase que
no la posea. Sobrescribir métodos:
int compare(Object elemento1, Object elemento2)
boolean equals(Object o)
(Ver ejemplos paquete collections.ordenaciones)
COLLECTIONS
Colecciones inmutables
Colecciones inmutables a partir de otras que no lo son.
Collections.unmodifiableXXXXXX(XXXXX c)
Ej: List l = Collections.unmodifiableList(List l2);
Colecciones sincronizadas
Colecciones seguras ante hilos.
Collections.synchronizedXXXXX(XXXXX c);
Ej: List l = Collections.synchronizedList(List l);
donde XXXXX representa el tipo de estructura.
Ver ejemplos collections.modificablesYsynchronized
NUEVAS ESTRUCTURAS DE COLLECTIONS
RESUMEN
Una de las partes de la librería con más cambios:
• Tres de las nuevas características del lenguaje (genéricos, for-each y autoboxing) están muy
relacionadas con las colecciones.
• Tres nuevas interfaces: java.util.Queue, java.util.concurrent.BlockingQueue y
java.util.concurrent.ConcurrentMap y varias implementaciones de estas interfaces.
• Implementaciones de java.util.Map y java.util.Set específicas para el uso con tipos enumerados.
• Implementaciones de java.util.List y java.util.Set específicas para copy-on-write.
• Implementaciones wrapper para proporcionar seguridad de tipos dinámica a la mayoría de los
tipos.
• Métodos que implementan nuevos algoritmos para la manipulación de colecciones.
• Métodos para generar códigos hash y representaciones de texto de arrays.
NUEVAS ESTRUCTURAS ROWSET
Los objetos RowSet, a diferencia de ResultSet, pueden operar sin la necesidad de mantener
abierta la conexión con la base de datos o data source.
Existen cinco nuevas implementaciones de JDBC RowSet:
JdbcRowSet: Para encapsular un ResultSet o un driver que utilice tecnología JDBC
CachedRowSet: Contiene en memoria la colección de filas obtenidas de la base de datos y
puede, si fuera necesario, sincronizarse posteriormente en el tiempo.
FilteredRowSet: Hereda de la anterior, y se utiliza para obtener un subconjunto de datos
WebRowSet: Ademas puede escribir y leer RowSet en formato XML.
JoinRowSet: Hereda de CachedRowSet y se emplea para unir múltiples objetos RowSet
USO DEL PATRÓN OBSERVER -
OBSERVABLE
El patrón Observer es utilizado cuando uno o más objetos (Observers) necesitan saber
sobre los cambios de estados u ocurrencia de eventos producidos en un objeto
Subject.
De esta forma cuando el Subject sufre un cambio de estado o ante un evento avisa a
los Observers y mediante el callback de una funcion notify que implementa cada
Observer estos reaccionan al evento.
USO DEL PATRÓN OBSERVER -
OBSERVABLE
USO DEL PATRÓN OBSERVER -
OBSERVABLE
Ejemplo:
class Perro extends Observable {
private int edad;
public void cumplirAños() {
this.edad++;
setChanged();
this.notifyObservers();
// avisa a sus observadores sobre el cambio
// de estado del objeto o del evento ocurrido
}
}
Concepto de package
Mecanismo para el diseño de aplicaciones
- Cambios en la implementación:
En todas las plataformas: Los archivos zip pueden contener mas de 64k entradas.
En windows:
Soportados nombres de archivos mayores de 256 caracteres.
Eliminada la limitación de abrir solo 2000 archivos zip símultáneamente (oh my god!!!)
http://download.java.net/jdk7/docs/technotes/tools/windows/jar.html
MECANISMOS PARA EL DISEÑO DE
APLICACIONES
Mejoras abundantes en Java Web Start. Muchas funcionalidades comunes de Java Web Start y Java
Plug-in se han unificado, y comparten panel de control: Java Control Panel.
Nuevo formato de compresión de ficheros jar, con mayor ratio de compresión, llamado Pack200.
Cuando se descarga por primera vez una aplicación que utiliza la tecnología Java Web
Start, el software de Java Web Start se ejecuta automáticamente y guarda la
aplicación localmente, en la memoria caché del equipo.
El software de Java Web Start ofrece tres métodos para ejecutar una aplicación:
Desde un navegador Web
http://java.sun.com/javase/technologies/desktop/javawebstart/1.2/es/docs/Readme_es.html
http://java.sun.com/javase/technologies/desktop/javawebstart/1.2/es/docs/installguide_es.html
http://java.sun.com/javase/technologies/desktop/javawebstart/demos.html
MEJORAS EN LIBRERÍAS
JSR-013 Decimal Arithmetic
La nueva versión de Java soporta Unicode 4.0, lo que hace insuficientes los 16
bits que se utilizaban hasta ahora para codificar caracteres. Algunos
caracteres, llamados caracteres suplementarios (suplementary characters),
que no son alcanzados por los 16 bits son representados con el tipo int.
La mayoría de las mejoras tienen que ver con el soporte de todas las
novedades del lenguaje:
- Es posible saber si un tipo es genérico y todos los detalles al respecto.
En J2SE 5.0 introduce una nueva versión JAXP 1.3 (en vez de JAXP 1.1 en J2SE 1.4) y
una nueva implementación de referencia basada en Apache Xerces (en vez de
Crimson en J2SE 1.4). Estos grandes cambios han traído algunas incompatibilidades
con las que hay que tener cuidado.
JAXP 1.3 mejora en varios aspectos la anterior versión, algunos son:
Proporciona un validador para XML Schema.
MEJORAS EN LIBRERÍAS
SERIALIZACIÓN
Se ha añadido soporte a la serialización de tipos enumerados, que difiere de la del resto
objetos serializables por sus particularidades.
Mejoras en los paquetes java.util.concurrent, java.util.concurrent.atomic y
java.util.concurrent.locks.
Estas utilidades generan un entorno para el desarrollo de aplicaciones
concurrentes potente, escalable y extensible, gracias a colecciones síncronas,
semáforos, variables atómicas, etc..
También proporcionan primitivas de bajo nivel para programación concurrente
avanzada llegando a un grado sólo posible hasta ahora con programación
nativa.
La clase Thread también ha sido mejorada en varios aspectos.
MEJORAS EN LIBRERÍAS
Librerías de integración
RMI, JNDI, CORBA, Java IDL, y Java RMI-IIOP también han sido mejorados.
Respecto a JDBC, la interfaz javax.sql.RowSet ha sido implementada de las cinco
formas más comúnmente usada.
Swing
Por fin es posible en Swing sustituir jFrame.getContentPane().add() por
jFrame.add().
También se ha añadido soporte de impresión para JTable.
Por último se han incorporado dos nuevos look and feel: Synth y Ocean.
Java Management Extensions (JMX) 1.2
En J2SE 5.0 se incluye el soporte a JMX en la librería estándar, hasta
ahora era una librería independiente.
COMPILADOR EN TIEMPO DE EJECUCIÓN
(JIT)
Con JIT el código es primero interpretado y posteriormente los “hot spot” son
compilados al vuelo
Necesario ejecutar los programas varias veces antes de medir
rendimientos.
Se incluye la pila de servicios web con nuevas mejoras como parte del API
JDK:
Consideraciones generales
Mecanismo de lanzamiento de throws
7. Throw Early.
Lanzar excepciones en cuanto se produzcan las condiciones necesarias.
Ejemplo:
public void readPreferences(String filename)
throws IllegalArgumentException {
if (filename == null){
throw new IllegalArgumentException("filename is null");
} //if
8. Catch Late
Capturar excepciones en las capas mas propicias para ello, donde el programa pueda recuperarse de la excepción u poder informar al usuario
de las causas.
BUENAS PRÁCTICAS EN LA GESTIÓN DE
EXCEPCIONES
Por tanto, la sobreescritura de métodos no obliga a indicar las excepciones lanzadas por un
método en la SuperClase de otra dada.
http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#227965
7. Multithreading
OBJETIVOS DE LA UNIDAD
Comunicación inter-threads.
Uso de synchronized
Java Realtime
ARQUITECTURA DE LOS THREADS
Definición
Unidad de ejecución de un proceso y está asociado con una secuencia de
instrucciones, un conjunto de registros y una pila.
Cada hilo se ejecuta de manera independiente (propio PC, registros y pila) pero
comparten espacio de direcciones compartir variables globales, ficheros
abiertos, elementos de sincronización, etc.
Cada hilo se ejecuta con una determinada prioridad ejecutándose antes lo de mayor
prioridad (setPriority()).
Estados de un hilo
- Nuevo: Hilo creado pero no activado. Cuando se active pasará al estado
preparado.
- Preparado: Hilo activo a la espera de asignación de CPU.
- En ejecución: Hilo activo y con CPU asignada.
- Bloqueado: Hilo espera que otro elimine el bloqueo
Dormido: Hilo bloqueado durante una cantidad de tiempo determinada
después del cual despierta y pasa a preparado.
Esperando: Esperando que ocurra (condición, operación E/S. Cuando
ocurra pasa al estado preparado.
- Muerto: Hilo finalizado pero no ha sido recogido por su padre
ARQUITECTURA DE LOS THREADS
Grupos
Cada hilo Java es miembro de un grupo de hilos. Puede ser el predefinido por la
JVM o uno especificado explícitamente.
Grupos
Tipos de grupos
- Predefinidos
Creación de un hilo sin especificar su grupo, la JVM lo coloca en el mismo
grupo del hijo bajo el cual se crea.
Grupos
Tipos de grupos
- Explícito
Ejemplo:
1.-Crear el grupo
ThreadGroup consumidores = new ThreadGroup(“consumidores”);
2.- Llamada a constructor dentro del hilo
public class Consumidor extends Thread{
private Mensaje msg;
public Consumidor(Mensaje msj, ThreadGroup grupo, String nombre){
super(grupo,nombre);
msg = msj;
}
public void run(){
//..
}
}
ESTABLECER GRUPOS Y PRIORIDADES
Prioridades
Cada hilo Java tiene una prioridad (1 a 10).
Constantes
Dentro de la clase Thread
MIN_PRIORITY = 1 NORM_PRIORITY = 5 MAX_PRIORITY = 10
Hilos con la misma prioridad permanecen en cola circular (algoritmo Round Robin). El
sistema asigna un cuanto de tiempo para la ejecución de los hilos
COMUNICACIÓN INTER-THREADS
Tuberías
Canalizan la entrada de un hilo en la salida de otro. De esta forma 2 hilos pueden compartir datos.
Uso:
PipedWriter emisor = new PipedWriter();
PipedReader receptor = new PipedReader(emisor);
Exclusión mutua
Garantizar que solo 1 hilo simultáneamente ejecuta la sección crítica (área con objetos comunes a
sincronizar).
En Java, cada objeto tiene un monitor (lock) que es controlado por un solo hilo simultáneamente.
El hilo al hacerse cargo del monitor bloquea el acceso por otro hilo. Cuando libera el monitor libera
el bloqueo.
Java implementa los monitores reentrantes: JVM permite tomar el control de un monitor a un hilo
que ya posee ese monitor (Ejemplo: Llamada a 2 métodos synchronized)
Synchronized
Podemos realizar la sincronización de 2 formas:
void m() {
synchronized(this) {
// ...
}
}
Executor
-Ejecución de threads.
Antes:
new Thread(new(RunnableTask())).start() ;
Ahora:
Executor executor = anExecutor;
executor.execute(new RunnableTask1());
executor.execute(new RunnableTask2());
- Ejecución de tareas
class ThreadPerTaskExecutor implements Executor {
public void execute(Runnable r) {
new Thread(r).start();
}
}
JAVA REAL TIME
Objetivo
Poder organizar a todas las tareas de tal manera que completen su trabajo antes de sus
metas de tiempo.
JAVA REAL TIME
La especificación
La Especificación de Tiempo Real para Java (RTSJ), o JSR 1, especifica cómo un sistema Java
debería comportarse en un contexto de tiempo real. La especificación fue desarrollada durante
varios años por expertos de Java y de aplicaciones en tiempo real.
La RTSJ está diseñada para extender la familia Java (toda la plataforma Java, Java SE, Java EE,
Java Micro Edition y demás), y tiene el requerimiento de que cualquier implementación debe
pasar el Test de Compatibilidad JSR 1 (TCK) y el TCK propio de la plataforma en la cual está
basada. Es decir RTSJ extiende naturalmente cualquiera de las plataformas Java existentes.
RTSJ introduce varias características nuevas para soportar operaciones en tiempo real. Estas
características incluyen nuevos tipos de thread, nuevos modelos de gestión de memoria, y
otros frameworks también nuevos.
JAVA REAL TIME
Enlaces
- http://java.sun.com/developer/technicalArticles/Programming/rt_pt1/
- http://java.sun.com/developer/technicalArticles/Programming/rt_pt2/index.html
- http://javolution.org/
8. Garbage Collector
OBJETIVOS DE LA UNIDAD
Arquitectura de la JVM
HotSpots (tipos, características, mejoras)
Uso de visualgc
Sincronización de hilos
Ergonomía (Ergonomics)
Las mejoras presentes en la versión J2SE 1.5 (Ergonomía) tratan de
proporcionar un buen rendimiento para la JVM con una mínima utilización
de las opciones (en línea de comandos).
Además del GC en serie a partir de la versión 1.5 existen los siguientes GC:
http://download.java.net/jdk7/docs/technotes/guides/vm/gc-ergonomics.html
CAMBIOS EN JAVA VIRTUAL MACHINE
Mejoras en JDK 6.0
http://salzotech.blogspot.com/2007/08/visualgc-con-
jvmstat.html
CONSIDERACIONES SOBRE FINALIZE()
Clases de entrada/salida
Herramientas runtime
Jmaps
JConsole
Permite la monitorización de la máquina virtual.
Visualiza:
- Uso de memoria Heap
- Hilos
- Clases cargadas
- % CPU utilizada.
Jconsole
HERRAMIENTAS
Jconsole
HERRAMIENTAS