Entiendo los métodos de Java equals y hashcode

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

Colecciones. Nadjet Bouayad-Agha Programación 2007

Pruebas de unidad con JUnit

Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

PROGRAMACIÓN ORIENTADA A OBJETOS (L40629) Sabino Miranda-Jiménez

En este capitulo se estudiarán los conceptos relacionados a métodos, como lo son sobrecarga, métodos estáticos.

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

16. Herencia Definición de herencia. 168 A. García-Beltrán y J.M. Arranz

2. Estructura de un programa en Java

ESCUELA SUPERIOR POLITECNICA DE CHIMBORAZO ESCUELA DE INGENIERIA EN SISTEMAS

Ejercicios del tema 7: Clases y objetos

FUNDAMENTOS DE PROGRAMACIÓN. SEPTIEMBRE 2005

Java para programadores objetosos. por Leo Gassman

Tema 3: Herencia en Java. Programación Orientada a Objetos Curso 2009/2010 Begoña Moros Valle

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Introducción a la Programación en Java

Este resumen ha sido elaborado para ser leído después de haber asistido a clase: pretende fijar y profundizar en los conceptos ya explicados.

Ejercicio 4. EJB Sesión - Sistema SGA. Java EE. Ejercicio 4. EJB Sesión Sistema SGA. Curso de Java EE

Compiladores e Intérpretes Proyecto N 1 Sintaxis de MiniJava Segundo Cuatrimestre de 2015

Programación Avanzada para Sistemas de Telecomunicación. Objetos y clases. J.C. Cruellas. Objetos y clases

INTELIGENCIA EN REDES DE COMUNICACIONES PRÁCTICA FINAL. Ignacio Ribas Ramos Miguel Flecha Lozano Ingeniería de Telecomunicaciones

Soluciones Ejercicios Tema 3

CLASES QUE UTILIZAN OBJETOS. RELACIÓN DE USO ENTRE CLASES JAVA. CONCEPTO DE DIAGRAMA DE CLASES. (CU00641B)

Universidad de Cantabria

Java en 3 horas. Ampliación de Sistemas Operativos. Rodrigo Santamaría

Primer Parcial Septiembre 5 de 2009

FIUBA Algoritmos y programación 3

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

15. Parámetros o argumentos

Objetivo de aprendizaje del tema

APELLIDOS:... NOMBRE:... GRUPO:... NÚMERO DE EXPEDIENTE:...

Prácticas de Programación

Tema 2. El lenguaje de programación Java (Parte 1)

Partes de un programa en Java. A. Ejemplo de un Programa en Java /* Programa Ejemplo de Java: Muestra una Ventana Archivo: Ejemplo1.

Metodología y Tecnología de la Programación

Práctica 3 mtp. metodoloxía e tecnoloxía da programación. Presentar detalles básicos sobre la sintaxis del lenguaje de programación Java.

EXAMEN PARCIAL 23 de Octubre de 2015 Programación I. Grado en Matemáticas e Informática ETSIINF UPM

Clase adicional 2. Estructuras básicas de control. Temas

Conexión SQL Server y C# (Consola)

Definición de clases: Herencia, polimorfismo, ligadura dinámica

1. Ejemplo de clase : La clase Cuenta 2. Uso de la clase Cuenta. 3. Métodos y objetos receptores de mensajes (Importante)

1. Manejo de memoria estática 2. Manejo de memoria dinámica

Introducción a Java LSUB. 30 de enero de 2013 GSYC

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Tema 2: Clase y objetos en Java. Programación Orientada a Objetos Curso 2009/2010 Begoña Moros Valle

Variables. Una variable no es más que un nombre simbólico que identifica una dirección de memoria: vs.

Java en 2 horas. Rodrigo Santamaría

Prácticas de Programación

Ejercicios de evaluación de fundamentos de programación en Java

Programación Orientada a Objetos en JAVA

Introducción al lenguaje Java

Programa Java. El lenguaje de programación Java. Comentarios. Programa Java. Palabras reservadas. Identificadores

Java Básico. Métodos estáticos

Clase 31. Hashing (Dispersión) Motivación

Lo que necesitaremos para programar en Java, será un editor de texto o IDE y la JDK.

Versión de Enero de 2015

Programación orientada a objetos

JAVA RMI (REMOTE METHOD INVOCATION)

Herencia e Interfaces

Programación Orientada a Objetos. Java: Excepciones

Refactorizar (v) Reestructurar el software aplicando una secuencia de refactorizaciones.

Clases. Java: Clases y Objetos. Clases. Clases. Modificadores de clase. Definición de una clase. Cada objeto es un ejemplar de una clase

Programación Orientada a Objetos en Java

Introducción a Java (II) Dr. (c) Noé Alejandro Castro Sánchez

Curso de Java Introducción a la Programación III

RESPUESTA Sí, una clase puede manejar objetos. Aunque esta frase es bastante ambigua, apréndetela de memoria para el examen y no le des más vueltas.

TEMA 7: Ficheros. TEMA 7: Ficheros Concepto de fichero

Introducción a la Programación Orientada a Objetos

4. Operadores Operador asignación

POO en Java IV: Herencia (Parte 1)

Tema 3: Herencia en C++ Programación Orientada a Objetos Curso 2008/2009 Begoña Moros Valle

Programación Orientada a Objetos. Java: Excepciones

Tema 6: Programación Orientada a Objetos en C# Programación Orientada a Objetos Curso 2009/2010 Begoña Moros Valle

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

Prácticas: Introducción a la programación en Java. Informática (1º Ingeniería Civil) Curso 2011/2012

PROGRAMACION ORIENTADA A OBJETOS Ingenieria Informática Final Febrero 2006/07

Introducción a la Programación Orientada a Objetos

Resumen Lenguaje Java

Elementos léxicos del lenguaje de programación Java

FACULTAD DE INGENIERÍA

Tema 7: Polimorfismo. Índice

PASO 1: Creamos un nuevo proyecto en NetBeans. Nos vamos a File y pulsamos sobre New Project

Estructura de las Aplicaciones Orientadas a Objetos Herencia de clases

Test : Conteste exclusivamente en una HOJA DE LECTURA ÓPTICA, no olvidando marcar que su tipo de examen es A.

APUNTES JAVA ARRAYS (ARREGLOS) Un arreglo es un grupo de posiciones de memoria contiguas. Todas las cuales tienen el mismo nombre y el mismo tipo.

Para leer la entrada de consola, lo primero que se hace es construir un Scanner que este asociado al flujo de entrada estándar System.

Identificadores, palabras reservadas, tipos de datos, operadores aritméticos y el sistema estándar de salida en Java

Tema 6. Reutilización de código. Programación Programación - Tema 6: Reutilización de código

Conversión entre Tipos

package com.example.dialogov1;

8. Sentencia return y métodos

Fundamentos del Lenguaje de Programación Java

public class AtaqueVoraz extends EsquemaVZ implements EstrategiaSolucion {

CAPÍTULO 5 H E R E N C I A (Clases abstractas e interfaces)

Los caracteres de Java pueden agruparse en letras, dígitos, espacios en blanco, caracteres especiales, signos de puntuación y secuencias de escape.

Caso práctico Alquiler de películas en un vídeo-club

ALGORITMICA Y PROGRAMACION POR OBJETOS I

CLASE DATE DEL API JAVA. MÉTODOS BEFORE, AFTER, TOLOCALESTRING, TOGMTSTRING Y GETTIME. EJEMPLOS. (CU00924C)

EJEMPLO DE CÓDIGO JAVA BÁSICO. CREAR CLASES CON CAMPOS, CONSTRUCTOR Y MÉTODOS. LA PALABRA CLAVE THIS (CU00652B)

Transcripción:

Todos los días cuando programamos usamos objetos y en muchas ocasiones necesitamos comparar unos con otros. Para ello en muchas ocasiones usamos los métodos de de Java equals y hashcode. Estos métodos generan muchas dudas entre los desarrolladores a la hora de usarlos. Vamos a crear una implementación por defecto para la clase Persona que realice un override sobre ambos métodos para entenderlos mejor. package com.arquitecturajava; public class Persona { private String nombre; private int edad; public String getnombre() { return nombre; public void setnombre(string nombre) { this.nombre = nombre;

public int getedad() { return edad; public void setedad(int edad) { this.edad = edad; @Override public int hashcode() { final int prime = 31; int result = 1; result = prime * result + ((nombre == null)? 0 : nombre.hashcode()); return result; @Override public boolean equals(object obj) { if (this == obj) return true; if (obj == null) if (getclass()!= obj.getclass()) Persona other = (Persona) obj; if (nombre == null) { if (other.nombre!= null) else if (!nombre.equals(other.nombre)) return true;

El método equals es el más sencillo de entender ya que comprueba si los dos objetos son del mismo tipo y si su nombre coincide. En tal caso el resultado será true y en todos los demás false. Para ello el método realiza una serie de comparaciones. El método hashcode Este método viene a complementar al método equals y sirve para comparar objetos de una forma más rápida en estructuras Hash ya que únicamente nos devuelve un número entero. Cuando Java compara dos objetos en estructuras de tipo hash (HashMap, HashSet etc) primero invoca al método hashcode y luego el equals. Si los métodos hashcode de cada objeto devuelven diferente hash no seguirá comparando y considerará a los objetos distintos. En el caso en el que ambos objetos compartan el mismo hashcode Java invocará al método equals() y revisará a detalle si se cumple la igualdad. De esta forma las búsquedas quedan simplificadas en estructuras hash.

Manejando colecciones Muchas veces se nos olvida que la invocación a los métodos equals y hashcode forma parte intrínseca del framework de colecciones. Por ejemplo si construimos dos objetos de tipo Persona y los añadimos a un HashSet, podemos comprobar que la Persona existe utilizando el método contains dentro del conjunto. package com.arquitecturajava; import java.util.hashset; public class Principal { public static void main(string[] args) { Persona p1= new Persona(); p1.setnombre("david"); Persona p2= new Persona(); p2.setnombre("miguel"); HashSet<Persona> conjunto= new HashSet<Persona>(); conjunto.add(p1); conjunto.add(p2); System.out.println(conjunto.contains(p1));

Esto nos devolverá true ya que el HashSet contiene este elemento. Ahora bien si nosotros sobreescribimos de forma incorrecta el hashcode con el siguiente código: @Override public int hashcode() { return (int)(math.random()*1000); Estaremos calculando al azar el hashcode y dos objetos iguales devolverán hashcodes diferentes.el HashSet nos devolverá false cuando invoquemos el método contains aunque sabemos que el elemento existe en el conjunto. Esto se debe a que Java comparará dos elementos primero por su hashcode y como no coinciden directamente devolverá falso. Por lo tanto si queremos sobreescribir

correctamente los métodos equals y hashcode debemos asegurarnos de que cuando dos objetos sean iguales devuelvan el mismo hashcode. Eso sí aunque nos parezca curioso dos objetos diferentes pueden tener mismo hashcode. Esto no está en constradicción con lo anteriormente expuesto.