martes, 31 de diciembre de 2013

El Collectioiis Framework de Java 1.2 - III

Clases Wrapper: Colecciones con características adicionales, como no poder ser modificadas o estar sincronizadas. No se accede a ellas mediante constructores, sino mediante métodos "factory** de la clase Collections. 
Clases de utilidad: Son mini-implementaciones que permiten obtener sets especializados, como por ejemplo sets constantes de un sólo elemento (singleton) o lists con ti copias del mismo elemento (nCopies). Definen las constantes EMPTY_SET y MPTY_LIST. Se accede a través de la clase Collections. 
Clases históricas: Son las clases Vector y Hashtable presentes desde las primeras versiones de Jara. En las versiones acmales. implementan respectivamente las interfaces List y Map. aunque conservan también los métodos anteriores. 
Clases abstractas: Son las clases abstract de la Figura 4.2. Tienen total o parcialmente implemen- tados los métodos de la interface correspondiente. Sirven para que los usuarios deriven de ellas sus propias clases con un mínimo de esfuerzo de programación. 
Algoritmos: La clase Collections dispone de métodos static para ordenar, desordenar, invertir orden, realizar búsquedas, llenar, copiar, hallar el mínimo y hallar el máximo. 
Clase Arrays: Es una clase de utilidad introducida en el JDK 1.2 que contiene métodos static para ordenar, llenar, realizar búsquedas y comparar los arrays clásicos del lenguaje. Permite también vel- los arrays como lists. Después de esta visión general de la Java Collections Framework. se verán algunos detalles de las clases e interfaces más importantes.

El Collectioiis Framework de Java 1.2 - II

Las clases Collections y Arrays son mi poco especiales: no son abstract. pero no tienen constructores públicos con los que se puedan crear objetos. Fundamentalmente contienen métodos static para realizar ciertas operaciones de utilidad: ordenar, buscar, introducir ciertas características en objetos de otras clases, etc. 
  Elementos del Java Collections Framework Interfaces de la JCF: Constituyen el elemento central de la JCF. 
• Collection: define métodos para tratar una colección genérica de elementos 
• Set: colección que no admite elementos repetidos 
• SortedSet: set cuyos elementos se mantienen ordenados según el criterio establecido 
• List: admite elementos repetidos y mantiene un orden inicial 
• Map: conjunto de pares clave/valor, sin repetición de claves 
• SortedMap: map cuyos elementos se mantienen ordenados según el criterio establecido 
Interfaces de soporte: 
• Iterator: sustituye a la interface Enumeratiou. Dispone de métodos para recorrer una colección y para borrar elementos. 
• Listlterator: deriva de Iterator y permite recorrer lists en ambos sentidos. 
• Comparable: declara el método compareToQ que permite ordenar las distintas colecciones según un orden natural (String. Date. Integer. Double. ...). 
• Comparator: declara el método compareQ y se utiliza en lugar de Comparable cuando se desea ordenar objetos no estándar o sustituir a dicha interface. 
Clases de propósito general: Son las implementaciones de las interfaces de la JFC. 
• Hash Set: Interface Set implementada mediante una hash table. 
• TreeSet: Interface SortedSet implementada mediante un árbol binario ordenado. 
• ArrayList: Interface List implementada mediante un array. 
• LinkedList: Interface List implementada mediante una lista vinculada. 
• Hash Map: Interface Map implementada mediante una hash table. 
• WeekHashMap: Interface Map implementada de modo que la memoria de los pares clave/valor pueda ser liberada cuando las claves no tengan referencia desde el exterior de la WeekHashMap. 
• TreeMap: Interface SortedMap implementada mediante un árbol binario

lunes, 30 de diciembre de 2013

El Collectioiis Framework de Java 1.2 - I

En la versión 1.2 del JDK se introdujo el Java Framework Collections o "estructura de colecciones de Java" (en adelante JCF). Se trata de un conjunto de clases e interfaces que mejoran notablemente las capacidades del lenguaje respecto a estructuras de datos. Además, constituyen un excelente ejemplo de aplicación de los conceptos propios de la programación orientada a objetos. Dada la amplitud de Java en éste y en otros aspectos se va a optar por insistir en la descripción general, dejando al lector la tarea de buscar las características concretas de los distintos métodos en la documentación de Java. En este apartado se va a utilizar una forma -más breve que las tablas utilizadas en otros apartados- de informar sobre los métodos disponibles en una clase o interface. La Figura 4.1 muestra la jerarquía de interfaces de la Java Collection Framework (JCF). En letra cursiva se indican las clases que implementan las correspondientes interfaces. Por ejemplo, hay dos clases que implementan la interface Map. HashMap y Hashtable. Las clases vistas en los apartados anteriores son clases "históricas", es decir, clases que existían antes de la versión JDK 1.2. Dichas clases se denotan en la Figura 4.1 con la letra "h" entre paréntesis. Aunque dichas clases se han mantenido por motivos de compatibilidad, sus métodos no siguen las reglas del diseño general del JCF: en la medida de lo posible se recomienda utilizar las nuevas clases.
En el diseño de la JCF las interfaces son muy importantes porque son ellas las que determinan las capacidades de las clases que las implementan. Dos clases que implementan la misma interface se pueden utilizar exactamente de la misma forma. Por ejemplo, las clases ArrayList y LinkedList disponen exactamente de los mismos métodos y se pueden utilizar de la misma forma. La diferencia está en la implementación: mientras que ArrayList almacena los objetos en un array, la clase LinkedList los almacena en una lista vinculada. La primera será más eficiente para acceder a un elemento arbitrario, mientras que la segunda será más flexible si se desea borrar e insertar elementos. 
La Figura 4.2 muestra la jerarquía de clases de la JCF. En este caso, la jerarquía de clases es menos importante desde el punto de vista del usuario que la jerarquía de interfaces. En dicha figura se muestran con fondo blanco las clases abstractas, y con fondo gris claro las clases de las que se pueden crear objetos.

domingo, 29 de diciembre de 2013

Clase Hashtable

La clase java.util.Hashtable extiende Dictionary (abstract) e implementa Cloueabley Serializable. Una hash table es una tabla que relaciona una clave con un valor. Cualquier objeto distinto de nuil puede ser tanto clave como valor. La clase a la que pertenecen las claves debe implementar los métodos hashCodef) y equalsf). con objeto de hacer búsquedas y comparaciones. 
El método hashCode() devuelve mi entero único y distinto para cada clave, que es siempre el mismo en una ejecución del programa pero que puede cambiar de una ejecución a otra. Además, para dos claves que resultan iguales según el método equalsf). el método 1iashCode() devuelve el mismo entero. Las hash tables están diseñadas para mantener una colección de pares clave/valor, permitiendo insertar y realizar búsquedas de un modo muy eficiente Cada objeto de Hashtable tiene dos variables: capacity y load factor (entre 0.0 y 1.0). Cuando el número de elementos excede el producto de estas variables, la Hashtable crece llamando al método rehashf). Un load factor más grande apura más la memoria, pero será menos eficiente en las búsquedas. Es conveniente partir de una Hashtable suficientemente grande para no estar ampliando continuamente

Hashtable números = new Hashtable ();
numbers.put("uno", new Integer(1));
numbers.put("dos", new Integer(2));
numbers.put("tres", new Integer(3));
donde se ha hecho uso del método putQ. La Tabla 4.7 muestra los métodos de la clase Hashtable.

sábado, 28 de diciembre de 2013

Clase Vector

La clase java.útil. Vector deriva de Object. implementa Cloneable (para poder sacar copias con el método cloneQ) y Serializable (para poder ser convertida en cadena de caracteres). Como su mismo nombre sugiere. Vector representa un array de objetos (referencias a objetos de tipo Object) que puede crecer y reducirse, según el número de elementos. 
Además permite acceder a los elementos con un índice, aunque no permite utilizar los corchetes []. El método capacity() devuelve el tamaño o número de elementos que puede tener el vector. El método size() devuelve el número de elementos que realmente contiene, mientras que capacitylncrement es una variable que indica el salto que se dará en el tamaño cuando se necesite crecer. La Tabla 4.6 muestra los métodos más importantes de la clase Vector. Puede verse que el gran número de métodos que existen proporciona una notable flexibilidad en la utilización de esta clase.
Además de capacitylncrement. existen otras dos variables miembro: elementCount. que representa el número de componentes válidos del vector, y elementData[] que es el array de Objects donde realmente se guardan los elementos del objeto Vector (capacity es el tamaño de este array). Las tres variables citadas son protected.

viernes, 27 de diciembre de 2013

Interface Enumeratiou

La interface java.utiLEnumeration define métodos útiles para recorrer una colección de objetos. Puede haber distintas clases que implementen esta interface y todas tendrán un comportamiento similar. La interface Enumeratiou declara dos métodos: 
  1. public boolean hasMoreElements(). Indica si hay más elementos en la colección o si se ha llegado ya al final. 
  2. public Object nextElement(). Devuelve el siguiente objeto de la colección. Lanza una NoSuchElementException si se llama y ya no hay más elementos. Ejemplo: Para imprimir los elementos de un vector vec se pueden utilizar las siguientes sentencias:

for (Enumeration e = vec.elements(); e.hasMoreElements(); ) {
System.out.println(e.nextElement());
}

donde, como puede verse en la Tabla 4.6. el método elementsQ devuelve precisamente una referencia de tipo Enumeratiou. Con los métodos hasMoreElements() y nextElement() y un bucle for se pueden ir imprimiendo los distintos elementos del objeto Vector.

COLECCIONES

Java dispone también de clases e interfaces para trabajar con colecciones de objetos. En primer lugar se verán las clases Vector y Hashtable. así como la interface Enumeration. Estas clases están presentes en lenguaje desde la primera versión. Después se explicará brevemente la Java Collections Framework, introducida en la versión JDK 1.2.