Proyecto/
├── Principal.java # Clase principal que ejecuta el programa
├── Persona.java # Clase que representa una persona con métodos hashCode y equals
├── HashTable.java # Clase que implementa la tabla hash personalizada
├── TablaHash.jar # Archivo JAR generado (ejecutable)
├── MANIFEST.MF # Archivo que especifica la clase principal del JAR
└── README.MD # Este mismo archivo
Este mini-proyecto implementa una tabla hash personalizada en Java como una demostración práctica de técnicas de programación segura. Algunos puntos a destacar de diseño e implementación:
- Diseño de la clase
HashTable
:- Utiliza buckets (listas enlazadas) para manejar colisiones de manera eficiente.
- El índice para cada clave se calcula con:
Esto garantiza que el índice esté en el rango del array y sea no negativo.
int index = Math.abs(key.hashCode()) % capacity;
- Manejo de colisiones:
- Los pares clave-valor que generan el mismo índice se almacenan en la lista enlazada del bucket correspondiente.
- Se recorre la lista enlazada solo cuando hay colisiones, minimizando la sobrecarga.
- Generalización (
HashTable<K, V>
):- Permite usar cualquier tipo de datos como claves y valores, siempre que las claves sobrescriban los métodos
equals
yhashCode
.
- Permite usar cualquier tipo de datos como claves y valores, siempre que las claves sobrescriban los métodos
- Métodos críticos de
Persona
:hashCode
combina los atributosnombre
yedad
para generar un código hash único.equals
compara estos atributos para determinar si dos objetosPersona
son equivalentes.
- Optimización de seguridad:
- Validación de entradas nulas en las operaciones de la tabla hash para evitar excepciones inesperadas.
- Uso de estructuras de datos estándar de Java que ya están probadas y optimizadas.
- Demostración en
Principal
:- Muestra cómo trabajar con la tabla hash: insertar, recuperar, y eliminar elementos, manejando colisiones sin problemas.
Nombre | Descripción | Fuente |
---|---|---|
java.util.LinkedList |
Implementa los buckets como listas enlazadas para manejar colisiones | Biblioteca estándar de Java (java.util ) |
java.util.Objects |
Ayuda en la implementación de equals y hashCode para la clase de prueba Persona |
Biblioteca estándar de Java ( java.util ) |
Ninguna: Este proyecto no utiliza bibliotecas o frameworks externos. Todo el código está basado en características integradas de Java.
Asegúrate de tener todos los archivos .java
en el mismo directorio. Compila los archivos con el siguiente comando:
javac Principal.java Persona.java HashTable.java
Esto genera los archivos .class
en el directorio actual.
Crea un archivo MANIFEST.MF con el siguiente contenido, asegurándote de incluir un salto de línea al final:
Main-Class: Principal
Luego, empaqueta los archivos .class en un archivo JAR con este comando:
jar cfm TablaHash.jar MANIFEST.MF *.class
Para asegurarte de que el archivo JAR incluye las clases correctas y el manifiesto, utiliza:
jar tf TablaHash.jar
Deberías ver algo similar a:
META-INF/
META-INF/MANIFEST.MF
Principal.class
Persona.class
HashTable.class
HashTable$Entry.class
Ejecuta el archivo JAR con este comando:
java -jar TablaHash.jar
Si todo está configurado correctamente, el programa mostrará la salida esperada.
Note
Asegúrate de usar la misma versión de Java para compilar y ejecutar el programa. Si cambias el nombre de la clase principal, actualiza el archivo MANIFEST.MF para reflejar el nuevo nombre.