Java Básico. Estructuras de Datos 2. Copyright

Documentos relacionados
Computación Geométrica Colecciones en Java

Definición de framework. Razonamiento Geométrico. El framework de colecciones de Java 1.2. Ejemplos de frameworks. Qué se define en un framework?

8. Colecciones e iteradores

Federico Peinado

Java Básico. Estructuras de Datos 1. Copyright

Colecciones de Java LSUB. 17 de febrero de 2016 GSYC

Lenguaje Java. Sesión 2: Colecciones de datos. Experto Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

Tema 3. Tipos List y Set

Colecciones. Interfaces para colecciones. Beneficios de utilizar el marco de colecciones. Interfaces para colecciones

Programación Tema 9: Bibliotecas y Colecciones. Programación DIT-UPM

Colecciones e iteradores

ARREGLOS Y COLECCIONES. Capítulo 7

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Clase 33. Marco para las colecciones de Java. Historia

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Unidad Didáctica 6. Tipos List y Set con tipos genéricos. Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos. Versión 1.0.

Tema 4 Colecciones en Java. Programación Orientada a Objetos Curso 2013/2014

Patrones de Diseño. Patrón de comportamiento Iterator. Técnicas de Programación - Curso 2007/08

Patrones de Diseño. Patrón de comportamiento Iterator. Técnicas de programación - Curso 2008/09 (Esther Guerra Sánchez)

INTERFACE LIST DEL API JAVA. CLASES ARRAYLIST, LINKEDLIST, STACK, VECTOR. EJEMPLO CON ARRAYLIST. (CU00920C)

Práctica 11e. Práctica 11e. José M. Ordax

Colecciones de Java LSUB. 30 de enero de 2013 GSYC

Java Collections List vs Set (I)

Programación en Java. Instructor:

Estructuras de Datos Clase 7 Listas e Iteradores (segunda parte)

Tutorial 11. Temas. Búsqueda Clasificación Estructura de Java Collection Problemas del tutorial Ejercicios de diseño. Búsqueda

Programación II 2do cuatrimestre 2017

Tema 3. Repaso de primero Análisis y Diseño de Algoritmos

U9 API Collections y Generics

INTERFACES MAP Y SORTEDMAP DEL API JAVA. CLASES HASHMAP Y TREEMAP. EJEMPLO. DIFERENCIAS ENTRE ELLAS. (CU00922C)

Ingeniería en Computación, Universidad de La Serena. import java.io.*; import java.util.linkedlist;

INTERFACE COLLECTION DE JAVA.UTIL DEL API JAVA. EJERCICIOS Y EJEMPLOS RESUELTOS. MÉTODOS ADD, REMOVE, SIZE. STREAMS (CU00917C)

Java Básico. Polimorfismo. Copyright

Práctica 11d. Práctica 11d. José M. Ordax

Colecciones de datos. Índice

INTERFACE ITERATOR DEL API JAVA. MÉTODO REMOVE PARA BORRAR OBJETOS EN COLECCIONES. EJERCICIOS Y EJEMPLO RESUELTO. (CU00919C)

Entiendo los métodos de Java equals y hashcode

INTERFACES SET Y SORTEDSET DEL API DE JAVA. CLASES HASHSET Y TREESET. EJEMPLO. DIFERENCIAS ENTRE ELLAS. (CU00924C)

PROGRAMACIÓN ORIENTADA A OBJETOS PROGRAMACIÓN ORIENTADA A OBJETOS. CONTAINERS (o COLLECTIONS) TEMA4: Más Collections: Conjuntos y Mapas

PROGRAMACIÓN ORIENTADA A OBJETOS

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Fundamentos de Programación

fundamentos de programación (unidad 7) herencia y relaciones entre clases

Interface nominterface{

Programación de sistemas Listas enlazadas

Fundamentos de Informática

Colecciones. Nadjet Bouayad-Agha Programación 2007

Sesión 5. TEMA 7 ESTRUCTURAS DE ALMACENAMIENTO Y AGRUPACIÓN DE OBJETOS

AGRUPANDO OBJETOS (Parte-II)

AGRUPA P R OBJET E OS 1

Sincronización por Colas en en Java

Estructuras de datos y algoritmos

Estructuras de datos y algoritmos

Práctica 11f. Práctica 11f. José M. Ordax

Algoritmos y Estructuras de Datos Iteradores. Guillermo Román Díez

PRÁCTICAS 15 Y 16: FACTORÍAS E ITERABLES Versión: 1.0.0

PROGRAMACIÓN ORIENTADA A OBJETOS PROGRAMACIÓN ORIENTADA A OBJETOS. [W1H3] Array de elementos atomicos. [W3H2] Array de objetos

Interfaces. Amparo López Gaona. Septiembre de Amparo López Gaona () Interfaces Septiembre de / 1

PROGRAMACIÓN ORIENTADA A OBJETOS

EL PAQUETE JAVA.UTIL DEL API JAVA. PRINCIPALES INTERFACES Y CLASES: STRINGTOKENIZER, DATE, CALENDAR, HASHSET, TREEMAP, TREESET...

Ejercicio 1 (proyecto prlistas, paquete listas)

ARREGLOS CLASE VECTOR. Ing. Marina Cipolletti

Arrays, Cadenas y Vectores Tipos Genéricos

PROGRAMACIÓN GENÉRICA

Programación orientada a objetos

1. Algunas clases del paquete java.util

3.6 Interfaces y Paquetes

Prácticas de Programación

ESTRUCTURA DE DATOS Y ALGORITMOS Titulación: Ingeniero Técnico en Informática de Gestión Curso: 2º Nombre y apellidos: Nota:

Tema 3: Genericidad en Java. Tema 3: Genericidad en Java. Objetivos y Bibliografía. Modelos de Datos Genéricos

Examen de Estructuras de Datos y Algoritmos (Ingeniería Informática)

Tema 3 Herencia en Java Parte 2. Programación Orientada a Objetos Curso 2015/2016

AGRUPANDO OBJETOS (Parte-I)

IN77J Orientación al Objeto para el e-business. 2. Fundamentos de la OOP

El programa P1 tiene como objetivo imprimir cada uno de los caracteres de una cadena en una línea, como por ejemplo: h o l a

ESTRUCTURA DE DATOS Y ALGORITMOS Titulación: Ingeniero Técnico en Informática de Gestión Curso: 2º Nombre y apellidos: Nota:

Algoritmos y Estructuras de Datos: Ordenación y Colas con Prioridad. Guillermo Román Díez

CAPITULO 5. COMPORTAMIENTO MAS SOFISTICADO

Tema 3 Herencia en Java Parte 2. Programación Orientada a Objetos Curso 2015/2016

Ordenación de colecciones de objetos.

Programación orientada a objetos

ArrayList en Java. Los principales métodos para trabajar con los ArrayList son los siguientes:

Estructuras de datos. Colecciones en C#. Arreglos, Listas, Pilas, Colas y Árboles Métodos de búsqueda y ordenamiento

EJERCICIO Y EJEMPLO RESUELTO: USO DE LA INTERFACE ITERABLE DEL API DE JAVA Y MÉTODO ITERATOR. RECORRER COLECCIONES DE OBJETOS (CU00915C)

Tema 5 Genericidad y Colecciones. Programación Orientada a Objetos Curso 2015/2016

Algoritmos y Estructuras de Datos Tema 2: Diseño de Algoritmos

ESTRUCTURA DE DATOS Y ALGORITMOS Titulación: Ingeniero Técnico en Informática de Gestión Curso: 2º

ANEXO II: Resumen de uso de colecciones

INTERFACE LIST. CLASE LINKEDLIST DEL API JAVA. EJERCICIO RESUELTO Y DIFERENCIAS ENTRE ARRAYLIST Y LINKEDLIST (CU00921C)

Lenguajes de Programación Curso Práctica 4. Herencia. Utilización de interfaces y clases abstractas. 1. Interfaces Clases abstractas 2

TIPO Y MÉTODO ITERATOR. ERROR JAVA.UTIL.CONCURRENT MODIFICATIONEXCEPTION. RESUMEN DE TIPOS DE BUCLES EN JAVA. (CU00667B)

Examen Teórico Convocatoria de Junio de 2012

Práctica 11c. Práctica 11c. José M. Ordax

Tema 7: Programación imperativa. Sesión 21: Programación imperativa (2)

INTERFACE COMPARATOR. DIFERENCIAS ENTRE COMPARATOR Y COMPARABLE. CLASE COLLECTIONS. EJERCICIOS RESUELTOS. (CU00918C)

Oracle Certified Professional, Java SE 6 Programmer 1Z0-851

Taller de Programación I. Tema 08: Estructuras Dinámicas de Datos en Java

Tema 4- Representación Enlazada

Transcripción:

Java Básico Estructuras de Datos 2 Copyright Copyright (c) 2004 José M. Ordax Este documento puede ser distribuido solo bajo los términos y condiciones de la Licencia de Documentación de javahispano v1.0 o posterior. La última versión se encuentra en http://www.javahispano.org/licencias/ 1

Colecciones Una colección es simplemente un objeto que agrupa varios elementos en uno solo. Se utilizan para guardar y manipular datos así como transmitir información entre métodos. En Java tenemos un framework de colecciones: Interfaces: representaciones abstractas de las colecciones que permiten usarlas sin conocer sus detalles. Implementaciones: colecciones concretas. Algoritmos: métodos que permiten realizar operaciones como búsquedas, ordenaciones, etc Colecciones Sin duplicados Con duplicados y acceso por índice Más rápido en accesos aleatorios ArrayList sincronizado Iteración según compareto Más rápido en accesos aleatorios Más rápido en accesos por delante o detrás. Iteración según inserción. 2

Colecciones Iteración según compareto Más rápido en accesos aleatorios HashMap sincronizado Iteración según inserción. Colecciones Todas las colecciones se encuentran en el paquete java.util.*; java.util.collection es la raíz de la jerarquía de las colecciones. Existirán especializaciones que permitan elementos duplicados o no, que permitan ordenar los elementos o no, etc. Esta clase contiene la definición de todos los métodos genéricos que deben implementar las colecciones. 3

java.util.collection Los métodos de este interfaz son: Operaciones básicas: int size(); // Número de elementos que contiene. boolean isempty(); // Si no contiene ningún elemento. boolean contains(object element); // Si contiene ese elemento. boolean add(object element); // Añadir un elemento. remove(object element); // Borrar un elemento. Iterator iterator(); // Devuelve una instancia de Iterator. java.util.collection Operaciones masivas: boolean containsall(collection c); // Si contiene todos esos elementos. boolean addall(collection c); // Añadir todos esos elementos. boolean removeall(collection c); // Borrar todos esos elementos. boolean retainall(collection c); // Borrar todos los elementos menos esos concretos. void clear(); // Borrar todos los elementos. 4

java.util.collection Operaciones con arrays: Object[] toarray(); // Devuelve un array con todos los elementos. Object[] toarray(object a[]); // Devuleve un array con todos los elementos. El tipo será el del array enviado. Nota: las colecciones no permiten el uso de tipos primitivos. Por tanto, siempre que necesitemos trabajar con ellos habrá que hacer uso de los Wrappers de Tipos Primitivos. java.util.iterator El interfaz Iterator representa un componente que permite iterar sobre los elementos de una colección. Todas las colecciones ofrecen una implementación de Iterator por medio del método: public Iterator iterator(); Sus métodos son: boolean hasnext(); // Si tiene mas elementos. Object next(); // Devuelve el primer elemento y se queda apuntando al siguiente. 5

java.util.iterator void remove(); // Elimina el primer alemento y se queda apuntando al siguiente. En el SDK 1.1.x existía otro interfaz: java.util.enumeration Pero ya no se usa. java.util.set El interfaz Set hereda del interfaz Collection. Pero no añade la definición de ningún método nuevo. Representa colecciones que no permiten tener elementos duplicados. Para saber si un elemento está duplicado, hace uso del método: public boolean equals(object o); Existen distintas implementaciones de este interfaz. 6

java.util.hashset: Es nueva en el SDK 1.2.x. java.util.set Ofrece el acceso mas rápido cuando dicho acceso es aleatorio. Su orden de iteración es impredecible. java.util.linkedhashset: Es nueva en el SDK 1.4.x. Su orden de iteración es el orden de inserción. java.util.treeset: Es nueva en el SDK 1.2.x. java.util.set Su orden de iteración depende de la implementación que los elementos hagan del interfaz java.lang.comparable: public int compareto(object o); 7

import java.util.*; public class TestHashSet HashSet ciudades = new HashSet(); ciudades.add("madrid"); ciudades.add("barcelona"); ciudades.add("malaga"); ciudades.add("vigo"); ciudades.add("sevilla"); ciudades.add("madrid"); // Repetido. Iterator it = ciudades.iterator(); while(it.hasnext()) System.out.println("Ciudad: " + it.next()); Ejemplo import java.util.*; Ejemplo public class TestLinkedHashSet LinkedHashSet ciudades = new LinkedHashSet(); ciudades.add("madrid"); ciudades.add("barcelona"); ciudades.add("malaga"); ciudades.add("vigo"); ciudades.add("sevilla"); ciudades.add("madrid"); // Repetido. Iterator it = ciudades.iterator(); while(it.hasnext()) System.out.println("Ciudad: " + it.next()); 8

import java.util.*; public class TestTreeSet TreeSet ciudades = new TreeSet(); ciudades.add("madrid"); ciudades.add("barcelona"); ciudades.add("malaga"); ciudades.add("vigo"); ciudades.add("sevilla"); ciudades.add("madrid"); // Repetido. Iterator it = ciudades.iterator(); Ejemplo while(it.hasnext()) System.out.println("Ciudad: " + it.next()); Nota: funciona porque java.lang.string implementa java.lang.comparable. java.util.list El interfaz List hereda del interfaz Collection. Representa colecciones con elementos en secuencia. Es decir, con orden. Permite tener duplicados. Es accesible mediante índice, de manera que se puede: Acceder a un elemento concreto de una posición. Insertar un elemento en una posición concreta. 9

java.util.list Los métodos que añade de este interfaz son: Acceso posicional: Object get(int index); // Devuelve el elemento de esa posición. Object set(int index, Object element); // Reemplaza el elemento de esa posición con ese elemento. void add(int index, Object element); // Inserta ese elemento en esa posición. Object remove(int index); // Elimina el elemento de esa posición. java.util.list boolean addall(int index, Collection c); // Inserta todos esos elementos en esa posición. Búsqueda: int indexof(object o); // Devuleve la posición de la primera ocurrencia de ese elemento. int lastindexof(object o); // Devuleve la posición de la última ocurrencia de ese elemento. Subcolecciones: List sublist(int from, int to); // Devuelve una lista con los elementos comprendidos entre ambas posiciones. 10

java.util.list Existen distintas implementaciones de este interfaz. java.util.arraylist: Es nueva en el SDK 1.2.x. Ofrece un tiempo de acceso óptimo cuando dicho acceso es aleatorio. java.util.linkedlist: Es nueva en el SDK 1.2.x. Ofrece un tiempo de acceso óptimo cuando dicho acceso es para añadir o eliminar elementos del comienzo y final de la lista (típico para pilas). java.util.vector: java.util.list Es como el ArrayList pero sincronizado lo que penaliza notablemente el rendimiento. La sincronización es importante cuando mas de un thread (hilo de ejecución) va a acceder a la colección. 11

import java.util.*; public class TestArrayList ArrayList ciudades = new ArrayList(); ciudades.add("madrid"); ciudades.add("barcelona"); ciudades.add("malaga"); ciudades.add("vigo"); ciudades.add(1,"sevilla"); ciudades.add("madrid"); // Repetido. Iterator it = ciudades.iterator(); while(it.hasnext()) System.out.println("Ciudad: " + it.next()); Ejemplo import java.util.*; public class TestArrayList2 ArrayList ciudades = new ArrayList(); ciudades.add("madrid"); ciudades.add("barcelona"); ciudades.add("malaga"); ciudades.add("vigo"); ciudades.add(1,"sevilla"); ciudades.add("madrid"); // Repetido. Ejemplo for(int i=ciudades.size()-1; i >=0; i--) System.out.println("Ciudad: " + i + " es: " + ciudades.get(i)); 12

import java.util.*; public class TestLinkedList LinkedList ciudades = new LinkedList(); ciudades.add("madrid"); ciudades.add("barcelona"); ciudades.add("malaga"); ciudades.add("vigo"); ciudades.add(1,"sevilla"); ciudades.add("madrid"); // Repetido. Iterator it = ciudades.iterator(); while(it.hasnext()) System.out.println("Ciudad: " + it.next()); Ejemplo import java.util.*; public class TestVector Vector ciudades = new Vector(); ciudades.add("madrid"); ciudades.add("barcelona"); ciudades.add("malaga"); ciudades.add("vigo"); ciudades.add(1,"sevilla"); ciudades.add("madrid"); // Repetido. Ejemplo for(int i=ciudades.size()-1; i >=0; i--) System.out.println("Ciudad: " + i + " es: " + ciudades.get(i)); 13

java.util.map El interfaz Map no hereda del interfaz Collection. Representa colecciones con parejas de elementos: clave y valor. No permite tener claves duplicadas. Pero si valores duplicados. Para calcular la colocación de un elemento se basa en el uso del método: public int hashcode(); java.util.map Los métodos de este interfaz son: Operaciones básicas: Object put(object key, Object value); // Inserta una pareja. Object get(object key); // Accede al valor de una clave. Object remove(object key); // Elimina una pareja. boolean containskey(object key); // Comprueba la existencia de una clave. boolean containsvalue(object value); // Comprueba la existencia de un valor. 14

java.util.map int size(); // Número de parejas. boolean isempty(); // Si no contiene ninguna pareja. Operaciones masivas: void putall(map t); // Añade todas las parejas. void clear(); // Elimina todas las parejas. Obtención de colecciones: public Set keyset(); // Devuelve las claves en un Set. public Collection values(); // Devuelve los valores en una Collection. java.util.map Existen distintas implementaciones de este interfaz. java.util.hashmap: Es nueva en el SDK 1.2.x. Ofrece un tiempo de acceso óptimo cuando dicho acceso es aleatorio. Su orden de iteración es imprevisible. java.util.hashtable: Es la versión sincronizada de HashMap. 15

java.util.map java.util.linbkedhashmap: Es nueva en el SDK 1.4.x. Su orden de iteración es el de inserción. java.util.treemap: Su orden de iteración depende de la implementación que los elementos hagan del interfaz java.lang.comparable: public int compareto(object o); import java.util.*; public class TestHashMap HashMap codigos = new HashMap(); codigos.put("01","urgente"); codigos.put("02","importante"); codigos.put("03","normal"); codigos.put("04","baja prioridad"); Ejemplo System.out.println("Aleatorio 03: " + codigos.get("03")); System.out.println("Aleatorio 01: " + codigos.get("01")); Set s = codigos.keyset(); Iterator it = s.iterator(); while(it.hasnext()) String aux = (String)it.next(); System.out.println(aux + ": " + codigos.get(aux)); 16

import java.util.*; Ejemplo public class TestHashtable Hashtable codigos = new Hashtable(); codigos.put("01","urgente"); codigos.put("02","importante"); codigos.put("03","normal"); codigos.put("04","baja prioridad"); System.out.println("Aleatorio 03: " + codigos.get("03")); System.out.println("Aleatorio 01: " + codigos.get("01")); Set s = codigos.keyset(); Iterator it = s.iterator(); while(it.hasnext()) String aux = (String)it.next(); System.out.println(aux + ": " + codigos.get(aux)); import java.util.*; Ejemplo public class TestLinkedHashMap LinkedHashMap codigos = new LinkedHashMap(); codigos.put("01","urgente"); codigos.put("02","importante"); codigos.put("03","normal"); codigos.put("04","baja prioridad"); System.out.println("Aleatorio 03: " + codigos.get("03")); System.out.println("Aleatorio 01: " + codigos.get("01")); Set s = codigos.keyset(); Iterator it = s.iterator(); while(it.hasnext()) String aux = (String)it.next(); System.out.println(aux + ": " + codigos.get(aux)); 17

import java.util.*; public class TestTreeMap TreeMap codigos = new TreeMap(); codigos.put("04","baja prioridad"); codigos.put("01","urgente"); codigos.put("03","normal"); codigos.put("02","importante"); Ejemplo System.out.println("Aleatorio 03: " + codigos.get("03")); System.out.println("Aleatorio 01: " + codigos.get("01")); Set s = codigos.keyset(); Iterator it = s.iterator(); while(it.hasnext()) String aux = (String)it.next(); System.out.println(aux + ": " + codigos.get(aux)); Nota: funciona porque java.lang.string implementa java.lang.comparable. Importancia de equals() y hashcode() Siempre que creemos nuestras propias claves para el uso de los Map, debemos sobreescribir los métodos equals() y hascode(). El motivo es que los Map utilizan estos dos métodos para llevar a cabo tanto las inserciones como las extracciones de valores. Para entender mejor el uso de estos dos métodos por parte de los Map, veamos un poco mas en detalle la estructura interna de este tipo de colección. 18

Importancia de equals() y hashcode() Estructura interna de un Map: Importancia de equals() y hashcode() Un Map internamente contiene una secuencia de compartimentos (buckets) donde se van almacenando todos los valores (clave/valor). Para decidir en qué compartimento se almacena un valor, se llama al método hashcode() del objeto utilizado como clave. Pero pueden ocurrir colisiones, es decir, que un compartimento ya esté utilizado por una pareja clave/valor. Esto puede ser debido a que: Dos objetos distintos devolvieron el mismo código hash. Dos códigos hash distintos correspondieron al mismo compartimento. 19

Importancia de equals() y hashcode() Imaginemos que hacemos un get del Map y el compartimento correspondiente tiene colisiones. Qué valor nos devuelve? Lo sabe mediante el uso del método equals() de la clave. Va iterando por todas las claves de ese compartimento para encontrar la que se ha pedido. Imaginemos que hacemos un put en el Map con una clave ya existente. Cómo sabe que ya existe y que hay que machacar el valor anterior? Lo sabe mediante el uso del método equals() de la clave. Itera para comprobar si ya existe. Importancia de equals() y hashcode() La implementación del método equals() debe cumplir las siguientes normas: Reflexiva: x.equals(x) debe devolver true. Simétrica: Si x.equals(y) devuelve true, y.equals(x) debe devolver también true. Transitiva: Si x.equals(y) devuelve true, e y.equals(z) devuelve true, x.equals(z) debe devolver también true. Consistente: Si x.equals(y) devuelve true, entonces las sucesivas invocaciones de x.equals(y) sin haber modificado el estado de x o y deben seguir devolviendo true. Null: x.equals(null) siempre debe devolver false. 20

Importancia de equals() y hashcode() Ejemplo: public class TestEquals private int valor1; private Integer valor2; public boolean equals(object o) if(this == o) // Primer paso. return true; if(!(o instanceof TestEquals)) // Segundo paso. return false; TestEquals param = (TestEquals)o; // Tercer paso. return param.valor1 == valor1 && param.valor2.equals(valor2); Importancia de equals() y hashcode() Ejemplo: TestEquals test1 = new TestEquals(1, new Integer(2)); TestEquals test2 = new TestEquals(1, new Integer(2)); System.out.println(test1.equals(test2)); Sin sobreescribir equals() Sobreescribiendo equals() 21

Importancia de equals() y hashcode() La implementación del método hashcode() debe cumplir las siguientes normas: La ejecución sucesiva del método hashcode() sobre un mismo objeto sin haber modificado su estado interno entre medias, debe devolver siempre el mismo código hash. Si x.equals(y) devuelve true, entonces tanto x como y deben generar el mismo código hash. Sin embargo, si x.equals(y) devuelve false, no es obligatorio que tanto x como y deban generar un código hash distinto. No obstante es lo deseable para evitar en la medida de lo posible las colisiones en los Map y por tanto ofrecer un mejor rendimiento. Importancia de equals() y hashcode() La implementación del método hashcode() no es una tarea tan trivial. No obstante, aquí proponemos dos sugerencias bastante sencillas: Convertir a String los valores de los distintos atributos de la clase. Concatenarlos y delegar la generación del código hash en el método hashcode() del String resultante (la clase String posee una implementación bastante eficaz del método hashcode()). Sumar el código hash de cada uno de los atributos de la clase (los wrappers de tipos primitivos también tienen sobreescrito el método hashcode()). 22

Importancia de equals() y hashcode() Ejemplo: public class TestHashCode private int valor1; private Integer valor2; public int hashcode() StringBuffer buffer = new StringBuffer(); buffer.append(integer.tostring(valor1)); buffer.append(valor2.tostring()); return buffer.tostring().hashcode(); Importancia de equals() y hashcode() Ejemplo: TestHashCode test1 = new TestHashCode(1, new Integer(2)); TestHashCode test2 = new TestHashCode(1, new Integer(2)); System.out.println(test1.hashCode()); System.out.println(test2.hashCode()); Sin sobreescribir hashcode() Sobreescribiendo hashcode() 23

Importancia de equals() y hashcode() El método equals() también es importante para el resto de colecciones. Por ejemplo, cómo funcionan los métodos contains(), add() y remove() de las colecciones? Para saber si un objeto está contenido en una colección se va llamando al método equals() de todos los objetos de la colección. Para borrarlo de una colección, se le busca de igual forma. Y para añadirlo en un Set que no permite duplicados, lo mismo. Importancia de equals() y hashcode() Ejemplo: TestEquals test1 = new TestEquals(1, new Integer(2)); List list = new ArrayList(); list.add(test1); TestEquals test2 = new TestEquals(1, new Integer(2)); System.out.println(list.contains(test2)); Sin sobreescribir equals() Sobreescribiendo equals() 24

Sentencia for/in 5.0 Esta nueva sentencia del J2SE 5.0 nos facilita la iteración por los elementos de cualquier tipo de colección: arrays, listas, etc (excepto Map). for(inicialización: colección) Nota: Se usa : en vez de ;. sentencias; Ejemplo: public void listar(arraylist param) for(object o: param) System.out.println(o); Sentencia for/in 5.0 Básicamente, se trata de una simplificación a la hora de codificar. Es decir, al final, el compilador convierte el código en una sentencia for convencional: public void listar(arraylist param) Iterator it = param.iterator(); while(it.hasnext()) System.out.println(it.next()); Veremos como trabajar con este nuevo tipo de sentencia en el capítulo dedicado a J2SE 5.0 25

Arrays vs. Collections Arrays: Tamaño estático. Su tamaño se conoce mediante el atributo length. Puede almacenar tanto tipos primitivos como tipos complejos. Solo pueden albergar elementos de un tipo. Arrays vs. Collections Collections: Tamaño dinámico. Su tamaño se conoce mediante el método size(). Solo puede almacenar tipos complejos. Puede albergar elementos de distinto tipo. 26

Head First Java Kathy Sierra y Bert Bates. O Reilly Bibliografía Learning Java (2 nd edition) Patrick Niemeyer y Jonathan Knudsen. O Reilly. Thinking in Java (3 rd edition) Bruce Eckel. Prentice Hall. The Java tutorial http://java.sun.com/docs/books/tutorial/ 27