Contenidos
Utilidades
Existe un conjunto de utilidades dentro del lenguaje Java
Se encuentran en el paquete java.util
Son clases útiles y de uso cotidiano, entre las que destacamos:
- Colecciones
- Collection
- List
- Set
- Map
- Collection
- Fechas
- Date
- Calendar
- Properties
- Scanner
Collection
El API de colecciones de Java incluye clases que son capaces de albergar conjuntos de objetos
Representan contenedores de objetos
Son estructuras dinámicas, crecen a medida que se añaden elementos y trabajan con Objects
-
Se puede añadir cualquier cosa
-
Al recuperar el elemento se debe hacer casting
Básicamente hay dos conjuntos:
-
Clases que implementan Collection
-
Representan contenedores de objetos
-
Básicamente hay listas (List) y conjuntos (Set)
-
-
Clases que implementan Map
Algunos de sus métodos más importantes son:
- boolean add(Object o)
añade un elemento a la colección
- boolean addAll(Collection c)
añade un grupo de objetos (otra colección) a la colección
- void clear()
vacía la colección
- boolean contains(Object o)
chequea si un elemento se encuentra dentro de la colección
- boolean isEmpty()
chequea si la colección está vacía
- Iterator iterator()
devuelve un java.util.Iterador para recorrer los elementos de la colección
- boolean remove(Object o)
quita un elemento de la colección
- int size()
número de objetos almacenados
- Object[] toArray(Object[] a)
devuelve un array con los elementos de la colección
List
Sirve como interface para clases que representan listas de datos o vectores dinámicos
Sus elementos son accesibles por medio de un indice
Hereda los métodos de Collection y además añade:
- void add(int index, Object element)
añade un elemento en una posición determinada
- Object get(int index)
devuelve el elemento que ocupa una posición determinada
- int indexOf(Object o)
devuelve el indice de la primera aparición del elemento en la lista (o -1 si no lo encuentra)
- Object remove(int index)
elimina el elemento que ocupa una posición determinada
- Object set(int index, Object element)
cambia el elemento que ocupa una posición determinada por otro elemento
Al añadir un objeto con add(Object), el elemento se añade al final
Al eliminar un objeto con remove(Object), todos los demás se desplazan para no dejar huecos
Los objetos List más habituales son Vector (es threadsafe) y ArrayList (no es threadsafe)
Set
Sirve como interface para clases que representan conjuntos de datos
No pueden tener elementos duplicados
Sus elementos no son accesibles por un indice
No añade métodos nuevos
Los objetos Set más habituales son HashSet y TreeSet
Map
Representan tablas de datos
Todo mapa se compone de un conjunto de entradas compuestas de:
- Una clave, sirve para recuperar el elemento
- Un valor
Los métodos más importantes son:
- void clear()
vacía la estructura
- boolean containsKey(Object key)
devuelve true si hay algún objeto almacenado con esa clave
- boolean containsKey(Object value)
devuelve true si el Map contiene ese objeto
- Object get(Object key)
permite recuperar un determinado elemento a partir de su clave
- boolean isEmpty()
indica si el Map está vacío
- Set keySet()
devuelve un conjunto de claves del Map
- Object put(Object key, Object value)
almacena un objeto en el mapa con una clase determinada. Si la clave ya esta almacenada se sustituye por un objeto asociado por el nuevo
- void putAll(Map t)
incluye un submapa en el mapa
- Object remove(Object key)
elimina un objeto de clave determinada
- int size()
devuelve el número de objetos almacenados
- Collection values()
devuelve el conjunto de valores almacenados en el mapa
Se implementan como tablas Hash
Los más habituales son HashMap (no es threadsafe) y Hashtable (es threadsafe)
Iterator
Hay colecciones a las que se accede por medio de un índice, otras no
Iterator permite recorrer colecciones de objetos independientemente de cómo estén organizadas
Otra ventaja, permite eliminar objetos sin tener que gestionar los indices
Los métodos más importantes son:
- boolean hasNext()
devuelve True si el iterador tiene algún elemento más
- Object next()
devuelve el siguiente elemento de la iteración
- void remove()
elimina de la colección el último elemento devuelto por el iterador
for con índice |
---|
|
Iterador |
---|
|
Fechas
Hay dos clases que permiten trabajar con fechas:
- Date
casi todos sus métodos están en desuso por lo que no es muy recomendable su uso
- Calendar
es una interface por lo que es muy fácil darle el comportamiento que queramos
Ambas representan internamente el tiempo mediante un valor de tipo long que representa el número de milisegundos desde la el 1 de Enero de 1970 a las 00:00:00 GMT
Ese valor puede ser obtenido usando System.currentTimeMillis()
Calendar permite muchas más operaciones con fechas que Date, aunque es más difícil de construir (al ser una interfaz deberemos hacer nosotros mismos su implementación)
Date
Es fácil de construir:
- new Date()
construye un objeto Date con la fecha actual del sistema
Métodos que no están en desuso:
- boolean after(Date when)
comprueba si la fecha es posterior a la entregada como parámetro
- boolean before(Date when)
comprueba si la fecha es anterior a la entregada como parámetro
- long getTime()
devuelve el número de milisegundos desde el 1 de Enero de 1970 a las 00:00:00 GTM
- void setTime(long time)
cambia la fecha por otra fecha en milisegundos
Métodos en desuso:
- int getDay()
devuelve el día de la semana para esa fecha o devuelve el día que representa ese instante en la zona local
Día de la semana Día Domingo Lunes Martes Miércoles Jueves Viernes Sábado Valor 0 1 2 3 4 5 6 - getMonth()
devuelve el mes para esa fecha empezando por 0
Meses Mes Enero Febrero Marzo Abril Mayo Junio Julio Agosto Septiembre Octubre Noviembre Diciembre Valor 0 1 2 3 4 5 6 7 8 9 10 11 - getYear()
devuelve el año para esa fecha a la que se le ha restado 1900
- getHours()
devuelve la hora para esa fecha, la cuál estará comprendida entre 0 y 23
- getMinutes()
devuelve los minutos para esa fecha, los cuales estarán comprendidos entre 0 y 59
- getSeconds()
devuelve los segundos para esa fecha, los cuales estarán comprendidos entre 0 y 61, los valores 60 y 61 sólo aparecerán cuando la MVJ se salte algunos segundos en una cuenta
Calendar
Clase abstracta para representar fechas en distintos tipos de calendarios
Incluye un montón de constantes para todos los días de la semana, meses, campos de una fecha…
En occidente para obtener la fecha del sistema utilizaremos el GregorianCalendar:
- new GregorianCalendar()
- new GregorianCalendar(2007, 1, 5)
Hay que prestar atención a la fecha:
-
es año, mes, día
-
Corresponde al 5 de Febrero de 2007 y no al 5 de Enero de 2007 como podría parecer a primera vista
Enero corresponde al valor 0
-
También podemos obtener la fecha del sistema mediante el método estático Calendar.getInstance()
Los métodos más destacable son:
- void add(int field, int amount)
suma (o resta, según el signo del operando) tiempo a una fecha
- boolean after(Object when)
comprueba si la fecha es posterior a la entregada como parámetro
- boolean before(Object when)
comprueba si la fecha es anterior a la entregada como parámetro
- int get(int field)
devuelve el valor de algún campo de la fecha, el cual especificamos con el parámetro field
- Date getTime()
convierte el tipo Calendar a Date
- void set(int field, int value)
cambia de valor un campo de la fecha
- void set(int year, int month, int date)
cambia el año, el mes y el día de la fecha
- void setTime(Date date)
a partir de un Date, crea un Calendar
Properties
Habitualmente el comportamiento de las aplicaciones puede cambiar en función de parámetros
Es muy cómodo colocar esos parámetros de configuración en ficheros para que la aplicación los lea según los necesite
Java dispone de la clase Properties que automatiza esta gestión
Cada línea del fichero de propiedades guarda una variable y tiene el formato:
Vamos a usar el fichero llamado conexion.properties que tendrá el siguiente contenido:
Para mostrar el uso de Properties con el siguiente ejemplo:
Scanner
Se puede utilizar la clase Scanner para leer tipos primitivos y Strings usando expresiones regulares
La clase Scanner recoge los caracteres pulsados desde el teclado hasta encontrar un delimitador que por defecto es el espacio
Los datos recogidos son convertidos a los diferentes tipos usando el método next<tipo>(), para recoger textos como String usaremos sólamente next()
De esta forma podremos recoger del teclado o de otros medios, los tipos de datos que necesitemos
En el ejemplo hemos leído un int desde el teclado
En el ejemplo hemos leído varios long desde un fichero llamado numeros.txt
En el ejemplo hemos leído varias palabras desde un String
Mostrándonos por pantalla:
Es decir, las palabras que contenía el String, cada una en una línea cada vez porque usamos println para mostrarlas por pantalla
Como podemos ver, si en cambio, hubiésemos utilizado print las habría mostrado todas en la misma línea sin ningún delimitador entre ellas
En el ejemplo hemos leído varias palabras desde un String cambiando el delimitador espacio por el delimitador 1
Para definir el nuevo delimitador usamos el método useDelimiter y le pasamos de parámetro una cadena que contiene una expresión regular, en este caso \\s*1\\s*
Mostrando por pantalla lo mismo que en el ejemplo anterior a pesar de usar un delimitador distinto