Apuntes Esenciales de Java
Apuntes Esenciales de Java
APUNTES DE JAVA
1/89
(Apuntes de Java)
Secuencias de escape
●
Son constantes de caracter que podemos incluir dentro de
un texto para reproducir un comportamiento especial
Secuencia Qué hace Ejemplo
2/89
(Apuntes de Java)
Math ([Link])
[Link]
4/89
(Apuntes de Java)
5/89
(Apuntes de Java)
Los objetos String en Java son en realidad un array de caracteres. Por ejemplo,
String saludo = “hola”; internamente es,
saludo[0]; → ’h’;
saludo[1]; → ’o’;
saludo[2]; → ’l’;
saludo[3]; → ’a’;
Los objetos String en Java son inmutables, esto es, no puede ser cambiados
internamente.
No podemos cambiar el valor de un caracter, [Link]., si queremos cambiar ‘o’ por ‘e’ en
la variable saludo de la siguiente forma saludo[1] = ‘e’; Java nos dará un error.
La forma como podemos obtener el resultado sería declarar una nueva variable String:
String saludoTemp = [Link](0)+"e"+[Link](2); //hela
8/89
(Apuntes de Java)
[Link]("Escribe un numero...");
int numero = [Link](); //recojemos un numero
[Link]("Has introducido el numero entero: "+numero);
9/89
(Apuntes de Java)
El operador ternario
int num = 8;
String mensaje = (num > 10) ? "El número es mayor de 10" : "El número es igual o menor que 10";
//El número es igual o menor que 10
10/89
(Apuntes de Java)
Excepciones
●
Cuando se produce un error en código, Java
internamente lanza/arroja (throw) una excepción y
se para la ejecución
●
Existe una forma de intentar (try) capturar (catch)
estos errores, y poder tratarlos para no interrumpir
la ejecución del código: con try-catch
●
Existen diferentes tipo de errores/excepciones en
Java dependiendo de su naturaleza o causa.
11/89
(Apuntes de Java)
Excepciones
●
Una excepción puede ocurrir por diversas causas,
por ejemplo:
– Un usuario introduce incorrectamente un carácter
cuando el programa pedía un número
– Un fichero que se va a leer no existe en la ruta
proporcionada
– Una conexión se pierde en mitad de una comunicación
– El JVM (máquina virtual de Java) se queda sin memoria
12/89
(Apuntes de Java)
Excepciones
●
Java reconoce tres categorías o fuentes de errores:
13/89
(Apuntes de Java)
Excepciones
Excepciones controladas o comprobadas (checked)
El programador/a no es el responsable del error ([Link]. un fichero que no se ha
encontrado en su sitio).Son excepciones detectadas por el compilador: el
programa no compilará a no ser que se capturen las excepciones
Errores (*)
cualquier error ajeno al programa y no manejable o capturable
15/89
(Apuntes de Java)
16/89
(Apuntes de Java)
try {
int posicionCuarta = unArray[3];
[Link]("PosicionCuarta es:" + posicionCuarta);
try {
FileReader fr = new FileReader(file);
} catch (FileNotFoundException e) {
[Link]("Excepción capturada: El fichero no existe.");
}
}
} Nota: en las excepciones no controladas,
Java no obliga a utilizar try-catch
18/89
(Apuntes de Java)
Excepciones: lanzamiento
19/89
(Apuntes de Java)
●
Cuando un método lleva throws en su declaración significa que si hay un error se
lanzará una Excepción de un tipo concreto que deberá ser recogida en algún otro
lugar del programa. Es decir, se delega la responsabilidad de capturar la Excepción
en otro método.
En el ejemplo de arriba, si hay un error se lanzará una Excepción (un objeto
perteneciente a la clase FileNotFoundException), pero si todo va bien, el constructor
hará lo que tenga que hacer cumpliendo con su código.
●
Podemos lanzar cualquier tipo de Excepción, tanto de la clase RuntimeException
y sus subclases (excepciones no controladas) como de la clase Exception y sus
subclases (excepciones controladas)
20/89
(Apuntes de Java)
try {
[Link](division(6,0));
} catch(Exception e) {
[Link]("Se ha producido un error:"+e);
}
}
return numerador/denominador;
}
}
21/89
(Apuntes de Java)
22/89
(Apuntes de Java)
return numerador/denominador;
}
23/89
(Apuntes de Java)
Excepciones: try-catch-finally
Imaginemos que estamos cocinando algo en el horno… Sea cual fuera
el resultado de la cocción, tanto si se ha horneado correctamente
como si no, al final de la cocción apagaremos el horno.
●
El código que englobe la cláusula finally se ejecutará
tanto si try-catch ha capturado una excepción como si no.
Excepciones: notas
●
Muchas veces por miedo a que el programe falle o se
interrumpa, el código se llena con sentencias try-catch, y
esto no es lo correcto. Los errores son fuentes de
información que una vez corregidos y tratados hacen que
un programa sea más estable. Es mejor preveer los
posibles errores que utilizar try-catch.
●
Utilizar try-catch en un código muy extenso es caro
computacionalmente hablando, es preferible utilizar
pequeños try-catch localizados con pocas líneas de
código a uno que incluya código muy extenso.
26/89
(Apuntes de Java)
Excepciones: notas
●
La diferencia entre errores y excepciones es que
los errores pueden corregirse y anticiparse,
pueden ser equivocaciones en la escritura de
código o maltinterpretaciones del Contexto, y las
excepciones son errores excepcionales. Un error
puede tratarse de antemano, por ejemplo, si
hemos hecho un programa que escriba líneas de
texto en un fichero, nos podría dar un error si
sobrepasamos el límite de tamaño del fichero, y
este error es previsible. Una excepción sería si en
el momento de escribir en el fichero se va la luz,
el disco duro se estropea o nuestro gato empieza
a pulsar teclas: son errores excepcionales.
27/89
(Apuntes de Java)
enum – Ejemplo 1
public class PruebasEnum {
29/89
(Apuntes de Java)
enum – Ejemplo 2
import [Link];
public class PruebasEnum2 {
enum PuntoCardinal { NORTE, SUR, ESTE, OESTE}
public static void main(String[] args) {
Scanner entrada=new Scanner([Link]);
[Link]("Hacia dónde iremos capitán? (NORTE, SUR, ESTE, OESTE)");
String respuesta = [Link]().toUpperCase(); //convertimos lo escrito a mayúsculas
//Para convertir la respuesta al tipo enumerado PuntoCardinal haremos lo siguiente
PuntoCardinal punto = [Link]([Link], respuesta);
String mensaje="";
switch(punto) {
case NORTE:
mensaje="Rumbo al Norte!";
break;
case SUR:
mensaje="Hacia los mares del Sur!";
break;
case ESTE:
mensaje="En el Este están las riquezas!";
break;
case OESTE:
mensaje="Viremos al Oeste!";
break;
}
[Link](mensaje);
}
}
30/89
(Apuntes de Java)
●
Para extraer el nombre de una constante utilizaremos el método name()
[Link]([Link]());
●
Los tipos enumerados funcionan como clases especiales que pueden tener
métodos propios y atributos (ver ejemplo siguiente)
31/89
(Apuntes de Java)
import [Link];
public enum PlanetaEnum { enum
enum –– clases
clases especiales
especiales
//Ejemplo extraído de [Link]
MERCURIO (3.303e+23, 2.4397e6),
VENUS (4.869e+24, 6.0518e6),
LA_TIERRA (5.976e+24, 6.37814e6),
MARTE (6.421e+23, 3.3972e6), Java obliga a que las
JUPITER (1.9e+27, 7.1492e7), constantes sean
SATURNO (5.688e+26, 6.0268e7),
URANO (8.686e+25, 2.5559e7), definidas primero
NEPTUNO (1.024e+26, 2.4746e7);
private final double masa, radio; // en kilos y en metros
public static final double G = 6.67300E-11; //constante gravitatoria universal
PlanetaEnum(double masaArg, double radioArg) {
[Link] = masaArg;
[Link] = radioArg; Constructor privado (obligado)
}
double gravedadEnSuperficie() {
return G * masa / (radio * radio);
}
double pesoEnSuperficie(double otherMass) {
return otherMass * gravedadEnSuperficie(); Al igual que una Clase
}
podemos incluir el
public static void main(String[] args) {
Scanner entrada = new Scanner([Link]); método main
[Link]("Cuál es tu peso?:");
double pesoEnLaTierra=[Link]();
double masaEnLaTierra = pesoEnLaTierra / LA_TIERRA.gravedadEnSuperficie();
for (PlanetaEnum planeta : [Link]()) {
[Link]("Tu peso sobre %s es %f%n", planeta, [Link](masaEnLaTierra));
}
[Link]();
}
}
32/89
(Apuntes de Java)
OpcionMenu(int numeroArg) {
numero = numeroArg;
}
[Link]([Link]()); //3
}
}
33/89
(Apuntes de Java)
Colecciones
●
Una colección es un objeto que representa un grupo de objetos
●
Pertenecen al framework Java Collections Framework que es
un conjunto de Clases e Interfaces utilizadas para el
tratamiento de colecciones de elementos.
●
Java Collections Framework es una jerarquía de clases
enfocadas en el tratamiento especializado de los elementos
que componen una colección.
●
En la cúspide de esta jerarquía tenemos dos interfaces
principales: [Link] y [Link]
34/89
(Apuntes de Java)
Colecciones
35/89
(Apuntes de Java)
Colecciones
36/89
(Apuntes de Java)
set(int index, E element) Sustituye el elemento ubicado en la posición index por el elemento pasado por
argumento
39/89
(Apuntes de Java)
Colecciones: ArrayList
●
Es una colección que tiene la estructura de un array y además
implementa la interface List
●
Es muy usada por su funcionalidad y flexibilidad
●
Muchos programadores/as prefieren utilizar ArrayList a un Array
●
Permite añadir elementos de diferente naturaleza y de una
forma dinámica cambiando su tamaño, así pues no tiene tamaño
fijo como un Array ni está fuertemente tipado (elementos del
mismo tipo)
40/89
(Apuntes de Java)
Colecciones: ArrayList
//Array Un array de longitud fija.
[Link]("Array de longitud fija");
int[] arreglo= {4,5,7,3}; Lo que hemos visto siempre
for (int cont=0; cont<[Link]; cont++) { hasta el momento.
[Link](arreglo[cont]);
}
//ArrayList
[Link]("Array dinámico, de longitud variable");
ArrayList unaLista = new ArrayList();
[Link](4);
Array dinámico, de add()
[Link](5);
Longitud variable [Link](7);
4
[Link](3);
un String !?: correcto
5
7 [Link]("Un texto"); size()
3
Un texto for (int cont=0; cont<[Link](); cont++) {
[Link]([Link](cont));
}
get()
41/89
(Apuntes de Java)
42/89
(Apuntes de Java)
Colecciones: ArrayList
4 formas de crear un ArrayList (y una Colección en general):
2) Utilizando Generics:
Arraylist<String> unaLista = new ArrayList<String>();
3) Utilizando Polimorfismo:
List unaLista = new ArrayList();
Colecciones: Iterators
●
Los elementos de una colección deben poder
recorrerse o iterarse para obtener sus valores o
contenidos
●
Es por esto que cada clase que implemente la
interface Collection tiene un interador interno
( .iterator() ) que permite recorrer su
contenido y elementos
●
Este iterador viene de la interface Iterable que
es implementada por la Interface Collection
●
Una forma cómoda de recorrer una colección es
utilizar for-each
44/89
(Apuntes de Java)
Colecciones: Iterators
public class EjemArrayListIterator {
public static void main(String[] args) {
[Link] unaLista = new [Link]();
[Link](4);
[Link](5);
[Link](7); (*) Elemento de la lista:4
[Link](3); Elemento de la lista:5
[Link]("Un texto"); Elemento de la lista:7
Elemento de la lista:3
Iterator<Object> iterador = [Link](); Elemento de la lista:Un texto
while ([Link]()) {
[Link]("Elemento de la lista:" + [Link]());
}
}
}
45/89
(Apuntes de Java)
Colecciones: ListIterators
Permiten recorrer una colección en ambas direcciones: hacia delante o hacia atrás
public class EjemploListIterator {
public static void main(String[] args) { (*) ListIterator es una interface
ArrayList unaLista = new ArrayList();
[Link](4);
[Link](5);
[Link](7); Hacia delante (next):
[Link](3); 4
[Link](6);
5
ListIterator listIterador=[Link](); 7
3
[Link]("Hacia delante (next):"); 6
//Hacia delante
while ([Link]()) { Hacia atrás (previous):
[Link]([Link]());
} 6
3
[Link]("Hacia atrás (previous):"); 7
//Hacia atrás 5
while ([Link]()) { 4
[Link]([Link]());
}
}
}
46/89
(Apuntes de Java)
Colecciones: LinkedList
●
Funciona de forma parecida a ArrayList, ya que comparte la misma Interface
List (además de otra llamada Deque)
●
La diferencia se encuentra en su interior. LinkedList es una lista
enlazada de elementos a través de direcciones de memoria. Los
elementos aquí se llaman nodos. ArrayList es una consecución de
elementos uno detrás de otro.
47/89
(Apuntes de Java)
Colecciones: LinkedList
●
La ventaja de LinkedList frente a ArrayList se encuentra al introducir o quitar
elementos: en un ArrayList si introducimos un elemento por la mitad, se tendrán que
mover todos los demás hacia la derecha. Si la lista es larga, tardará bastante en mover
todos los elementos.
●
Con un LinkedList, al estar enlazados los elementos, si insertamos por la mitad,
solamente habrá que modificar pocos elementos.
ArrayList LinkedList
Inserción de 10 millones de elementos (en milisegundos)
(promedio):
2558 ms (2,5 s) 11055 ms (11 s)
Inserción de 10 millones de elementos + inserción de
55000 elementos a partir de la posición 5000 (en
milisegundos) (promedio):
247260 ms (4,1 mins) 16880 ms (16,8 s)
48/89
(Apuntes de Java)
Colecciones: Vector
●
Al igual que ArrayList y LinkedList, Vector implementa la interface List y
toda su funcionalidad.
●
Ofrece un rendimiento más bajo que ArrayList en la búsqueda, adición,
actualización o borrado de sus elementos, por lo que ArrayList es preferible.
●
Vector y su clase especializada Stack están desde el principio de Java,
incluso antes del Java Collection Framework
●
Vector tiene una característica que es su capacidad (capacity()). Es una
propiedad interna que añade y reserva un espacio para los siguiente
elementos. Una vez superada esta capacidad por el número de elementos, se
dobla automáticamente.
No confundir con size() que es la cantidad de elementos que contiene esta
colección.
49/89
(Apuntes de Java)
Colecciones: Vector
public static void main(String[] args) {
[Link](100); //0
[Link](200); //1 Capacidad del Vector:10
[Link](300); //2 Elemento en posicion 5: 600
[Link](400); //3 Capacidad del Vector:20
[Link](500); //4 Elemento en posicion 0: 100
[Link](600); //5
[Link]("Elemento en posicion 5: " + [Link](5)); //600
//[Link]("Elemento en posicion 6: " + [Link](6)); //Error
[Link](700);
[Link](800);
[Link](900);
[Link](1000);
[Link](1100);
[Link]("Capacidad del Vector:" + [Link]()); //20
Collections: Stack
●
Clase especializada de Vector, heredad su funcionalidad y a su vez la funcionalidad
de la Interface List
●
Se traduce como Pila o apilar
●
Sigue el proceso LIFO (Last Input First Output o “el último en entrar es el primero
en salir”)
51/89
(Apuntes de Java)
Collections: Stack
●
Añade a Vector las siguientes funciones:
52/89
(Apuntes de Java)
Collections: Stack
public static void main(String[] args) {
Stack<String> pila=new Stack<String>();
[Link]("Plato uno"); //También valdría [Link]("Plato uno")
[Link]("Plato dos");
[Link]("Plato tres");
[Link]("Primer elemento: " + [Link]()); //Plato tres
String elementoExtraido=[Link]();
[Link]("Elemento extraido:"+ elementoExtraido); //Plato tres
String otroExtraido=[Link]();
[Link]("Otro elemento extraido:"+ otroExtraido); //Plato dos
Colecciones (cont.)
54/89
(Apuntes de Java)
cola cabecera
55/89
(Apuntes de Java)
add(E e) Inserta un elemento en la cola (al final) devolviendo true si ha sido correcta la
inserción o devolviendo una excepción si no ha sido correcta
element() Devuelve el elemento situado en la cabecera de la cola sin eliminarlo. También
devuelve una excepción si no hay elementos en la cola.
offer(E e) Inserta un elemento en la cola devolviendo true si ha sido correcta la inserción y
false (a diferencia de add()) si no se ha insertado correctamente
peek() Devuelve el elemento situado en la cabecera de la cola sin eliminarlo. Devuelve null
si la cola no tiene elementos (está vacía) (no devuelve excepción)
poll() Devuelve el elemento situado en la cabecera de la cola eliminándolo de la cola.
Devuelve null si la cola no tiene elementos.
remove() Devuelve y elimina el elemento situado en la cabecera de la cola.
56/89
(Apuntes de Java)
[Link]("Cliente 2");
[Link]("Cliente 3");
[Link]("Cliente 4");
58/89
(Apuntes de Java)
[10, 30, 32, 60, 40, 35] [10, 30, 32, 60, 40, 35]
Los nodos se
comparan con sus
nodos próximos y
Entrada de datos mediante offer() Eliminamos la cabecera (10) se reordenan
y el último nodo ocupa su
posición
[30, 35, 32, 60, 40]
60/89
(Apuntes de Java)
Salida:
[10, 30, 32, 60, 40, 35, 39]
61/89
(Apuntes de Java)
Collections: Deque
●
La interface Deque representa una colección que permite
la inserción y extracción de elementos en ambos
extremos (a diferencia de Queue)
●
Deque significa ‘double ended queue’ (cola de doble
terminación, doble entrada o doble extremo)
●
Las clases que implementan esta interface son
ArrayDeque y LinkedList
●
Se comporta como un Queue (FIFO) o como un Stack
(LIFO) según los métodos que usemos
62/89
(Apuntes de Java)
addFirst() addLast()
63/89
(Apuntes de Java)
[Link]
65/89
(Apuntes de Java)
Colecciones (cont.)
67/89
(Apuntes de Java)
●
Set (conjunto) hace referencia a una colección de
objetos sin elementos duplicados. Formalmente, que un
elemento e1 y otro elemento e2 no cumplan la
condición [Link](e2).
●
Dependiendo de la implementación (HashSet,
LinkedHashSet, TreeSet) se permite la introducción de
elementos null
68/89
(Apuntes de Java)
69/89
(Apuntes de Java)
71/89
(Apuntes de Java)
[Link]([Link]([Link]()));
[Link](elem10); //añadimos el 6
[Link]("Añadimos el valor 6...");
[Link]([Link]([Link]()));
[Link]("(el 6 sí se añade al final)");
}
72/89
(Apuntes de Java)
73/89
(Apuntes de Java)
//String elem1=null;
int elem5 = 5, elem6 = 7, elem7 = 23, elem8 = 2, elem9 = 2, elem10=6;
//[Link](elem1); //Devuelve excepción (null)
[Link](elem5);
//[Link]("elem3"); //Devuelve excepción porque es de diferente tipo al
primer elemento introducido
[Link](elem6);
[Link](elem7);
[Link](elem8); [2, 5, 7, 23]
[Link](elem9); //intentamos añadir un 2 duplicado Añadimos el valor 6...
[2, 5, 6, 7, 23]
[Link]([Link]([Link]())); (ordena consecutivamente)
[Link](elem10); //añadimos el 6
[Link]("Añadimos el valor 6...");
[Link]([Link]([Link]()));
[Link]("(ordena consecutivamente)");
}
74/89
(Apuntes de Java)
Colecciones (cont.)
75/89
(Apuntes de Java)
76/89
(Apuntes de Java)
Colecciones: HashMap
●
Permite introducir valores null, y la clave null
●
No se garantiza el orden de la inserción según la clave (no hay un
orden específico ni fijo), y además éste puede ser variable en el
tiempo
●
No está sincronizado (not synchronized) con lo cual si varios hilos
(threads) de una aplicación concurrente acceden a los valores de
un HashMap podrían dar resultados diferentes si alguno de estos
hilos los modifica. La solución pasa por utilizar la clase
ConcurrentHashMap
●
No permite introducir claves duplicadas (por la interface Map)
77/89
(Apuntes de Java)
Colecciones: TreeMap
●
Las entradas se ordenan según el orden natural de sus keys,
esto es, si son números de menor a mayor, si son cadenas en
orden alfabético
●
Esto garantiza que las keys siempre se ordenarán acorde a
un orden específico y estable (a diferencia de HashMap)
●
Es una implementación de NavigableMap y por tanto
funciona internamente como árbol de búsqueda
autobalanceado (red-black tree)
78/89
(Apuntes de Java)
Colecciones: Hashtable
79/89
(Apuntes de Java)
Colecciones: SortedMap
80/89
(Apuntes de Java)
Ficheros e I/O
●
Clases contenidas en el package [Link]
●
I/O = Input/Output
●
Unido al concepto de Stream (traducido como corriente
o torrente): es una secuencia de información
(normalmente bytes) a través de un canal
●
Hay 2 clases abstractas de Stream principales:
– De entrada al programa (lectura): InputStream
– De salida a un destino (escritura): OutputStream
81/89
(Apuntes de Java)
Ficheros e I/O
●
Conceptos relacionados
– Flush(): vaciar la secuencia de salida y obliga a escribir los bytes de
salida almacenados en el búfer.
– Close(): cierra el stream y libera todos los recursos del sistema
asociados con la secuencia.
– Read(): lectura desde un Stream de entrada
– Write(): escritura en un Stream de salida
– Buffer / Buffering: es una área de memoria donde poder almacenar y
leer información finita.
82/89
(Apuntes de Java)
Ficheros e I/O
83/89
(Apuntes de Java)
Ficheros I/O
●
FileOutputStream : escribir información (un byte) a un fichero
import [Link];
import [Link];
[Link]("Fichero escrito...");
} catch (Exception e) {
[Link](e);
} finally {
if (fichSalida != null) [Link]();
}
}
}
84/89
(Apuntes de Java)
Ficheros I/O
●
FileOutputStream (escribir un array de bytes a fichero)
import [Link];
import [Link];
Ficheros e I/O
●
FileInputStream: obtiene o lee bytes (información) desde un
fichero ([Link]. audio, video, imágenes, etc.)
import [Link];
import [Link];
public class EjemploFileInputStream {
// Lee un solo byte de un fichero llamado [Link]
public static void main(String args[]) throws IOException {
FileInputStream elStream = null;
try {
elStream = new FileInputStream("C:\\temp\[Link]");
int elByte = [Link](); // lee un byte
[Link]((char) elByte);
} catch (Exception e) {
[Link](e);
} finally {
if (elStream != null)
[Link]();
}
}
}
86/89
(Apuntes de Java)
Ficheros e I/O
●
FileInputStream (leer todos los bytes de un fichero)
import [Link];
import [Link];
Ficheros I/O
●
FileWriter: clase especializada en la escritura de texto en un fichero
import [Link];
import [Link];
} catch (Exception e) {
[Link](e);
} finally {
if (escritor != null)
[Link]();
}
[Link]("Fichero escrito...");
}
}
88/89
(Apuntes de Java)
Ficheros I/O
●
FileReader: clase especializada en la lectura de ficheros
import [Link];
import [Link];
public class EjemploFileReader {
public static void main(String[] args) throws IOException {
FileReader lector = null;
int i=0;
try {
// El fichero tiene que existir
lector = new FileReader("c:\\temp\\[Link]");
while((i=[Link]())!=-1)
[Link]((char)i);
} catch (Exception e) {
[Link](e);
} finally {
if (lector != null)
[Link]();
}
[Link]("Fichero leido...");
}
}
89/89