Método hashCode de Integer en Java

JavaBeginner
Practicar Ahora

Introducción

Esta práctica cubrirá el uso del método hashCode(int n) de la clase Integer de Java. Aprenderemos cómo generar un valor entero único, conocido como código hash, para un valor entero dado.

Creando un archivo de programa Java

Crea un archivo llamado IntegerHashcode.java en el directorio ~/project y úbrelo en tu editor de texto favorito.

touch ~/project/IntegerHashcode.java
touch ~/project/IntegerHashcode.java

Importando la clase requerida

Importa la clase Integer del paquete java.lang.

import java.lang.Integer;

Generando códigos hash para valores enteros

En este paso, generaremos códigos hash para valores enteros utilizando el método hashCode(int n). Crearemos una aplicación que le pida al usuario que ingrese un valor entero y luego genere el valor del código hash para el entero ingresado.

import java.lang.Integer;
import java.util.Scanner;

public class IntegerHashcode {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("Enter an integer value: ");
        int value = sc.nextInt();

        int hashValue = Integer.hashCode(value);

        System.out.println("Hash code value for " + value + " is " + hashValue);
    }
}

En el código anterior, hemos importado la clase Scanner del paquete java.util para la entrada. Le pedimos al usuario que ingrese un valor entero y lo leemos utilizando el método nextInt() de la clase Scanner. Luego generamos el valor del código hash para el entero ingresado utilizando el método hashCode(int n) y lo imprimimos en la consola utilizando el método println().

Compilando y ejecutando el programa

Guarda y cierra el archivo. Compila el archivo IntegerHashcode.java utilizando el siguiente comando.

javac IntegerHashcode.java

Ejecuta el programa utilizando el siguiente comando.

java IntegerHashcode

Se te pedirá que ingreses un valor entero. Ingresa cualquier valor entero y presiona la tecla Enter. El programa generará el valor del código hash para el valor entero ingresado y lo mostrará en la consola.

Modificando el programa

Modifiquemos la aplicación para generar códigos hash para múltiples valores enteros ingresados por el usuario.

import java.lang.Integer;
import java.util.Arrays;
import java.util.Scanner;

public class IntegerHashcode {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("Enter number of integer values: ");
        int count = sc.nextInt();
        int[] values = new int[count];

        for (int i = 0; i < count; i++) {
            System.out.print("Enter integer value " + (i+1) + ": ");
            values[i] = sc.nextInt();
        }

        int[] hashValues = new int[count];

        for (int i = 0; i < count; i++) {
            hashValues[i] = Integer.hashCode(values[i]);
        }

        System.out.println("Entered integer values: " + Arrays.toString(values));
        System.out.println("Corresponding hash code values: " + Arrays.toString(hashValues));
    }
}

En el código anterior, hemos agregado un bucle para leer múltiples valores enteros del usuario y generar valores de código hash para ellos. Almacenamos los valores enteros y los valores de código hash en arrays separados y los imprimimos en la consola utilizando el método toString() de la clase Arrays.

Compilando y ejecutando el programa modificado

Guarda y cierra el archivo. Compila el archivo IntegerHashcode.java nuevamente utilizando el siguiente comando.

javac IntegerHashcode.java

Ejecuta el programa modificado utilizando el siguiente comando.

java IntegerHashcode

Sigue los mensajes para ingresar múltiples valores enteros. El programa generará valores de código hash para cada valor entero y los mostrará en la consola.

Explorando colisiones de códigos hash

Una colisión de código hash ocurre cuando múltiples objetos generan el mismo valor de código hash. Aunque el método hashCode(int n) genera valores de código hash únicos para cualquier valor entero dado, no es infalible. Todavía existe la posibilidad de colisiones de códigos hash, especialmente cuando los valores de código hash y el algoritmo subyacente que genera los códigos hash no son lo suficientemente robustos.

Demostremos una colisión de código hash utilizando el método hashCode(int n). Modifica la aplicación generando valores de código hash para un conjunto de valores enteros predefinidos como se muestra a continuación.

import java.lang.Integer;
import java.util.Arrays;

public class IntegerHashcode {
    public static void main(String[] args) {
        int[] values = {100, 200, 300, 400, 500};

        int[] hashValues = new int[values.length];

        for (int i = 0; i < values.length; i++) {
            hashValues[i] = Integer.hashCode(values[i]);
        }

        System.out.println("Input integer values: " + Arrays.toString(values));
        System.out.println("Corresponding hash code values: " + Arrays.toString(hashValues));
    }
}

En el código anterior, hemos predefinido un array de valores enteros y generamos valores de código hash para cada uno de ellos. Luego imprimimos tanto los valores de entrada como sus correspondientes valores de código hash en la consola.

Compilando y ejecutando el programa final

Guarda y cierra el archivo. Compila el archivo IntegerHashcode.java una última vez utilizando el siguiente comando.

javac IntegerHashcode.java

Ejecuta el programa final utilizando el siguiente comando.

java IntegerHashcode

Notarás que los valores de código hash de 100 y 200 son los mismos. Esta es una colisión de código hash. Aunque las colisiones de código hash son raras, pueden causar problemas potenciales con las colecciones basadas en hash en Java.

Resumen

En este laboratorio, aprendimos sobre el método hashCode(int n) de la clase Integer de Java. Aprendimos cómo generar valores únicos de código hash para valores enteros utilizando este método. También aprendimos cómo manejar las colisiones de código hash y las limitaciones de los códigos hash en Java.