Hash Table Implementation in Java

1. Introduction

A hash table is a data structure that implements an associative array abstract data type, a structure that can map keys to values. The primary operation it supports efficiently is a lookup. In essence, it works by transforming the key using a hash function into an index of an array where the corresponding value is stored.

2. Implementation Steps

1. Define a HashTable class.

2. Each entry in the hash table will be a KeyValuePair to store both key and value.

3. Implement methods like put(), get(), and remove().

4. Handle collisions using chaining - each cell of the hash table will contain a list of key-value pairs.

3. Implementation in Java

import java.util.LinkedList; class KeyValuePair<K, V> { K key; V value; KeyValuePair(K key, V value) { this.key = key; this.value = value; } K getKey() { return key; } V getValue() { return value; } void setValue(V value) { this.value = value; } } class HashTable<K, V> { private LinkedList<KeyValuePair<K, V>>[] table; private static final int INITIAL_CAPACITY = 16; private int size = 0; @SuppressWarnings("unchecked") public HashTable() { table = new LinkedList[INITIAL_CAPACITY]; } private int hash(K key) { return key.hashCode() % table.length; } public V get(K key) { int index = hash(key); LinkedList<KeyValuePair<K, V>> bucket = table[index]; if (bucket == null) { return null; } for (KeyValuePair<K, V> pair : bucket) { if (pair.getKey().equals(key)) { return pair.getValue(); } } return null; } public void put(K key, V value) { int index = hash(key); if (table[index] == null) { table[index] = new LinkedList<>(); } LinkedList<KeyValuePair<K, V>> bucket = table[index]; for (KeyValuePair<K, V> pair : bucket) { if (pair.getKey().equals(key)) { pair.setValue(value); return; } } bucket.add(new KeyValuePair<>(key, value)); size++; } public V remove(K key) { int index = hash(key); LinkedList<KeyValuePair<K, V>> bucket = table[index]; if (bucket == null) { return null; } for (KeyValuePair<K, V> pair : bucket) { if (pair.getKey().equals(key)) { bucket.remove(pair); size--; return pair.getValue(); } } return null; } public int size() { return size; } public static void main(String[] args) { HashTable<String, Integer> hashTable = new HashTable<>(); hashTable.put("one", 1); hashTable.put("two", 2); hashTable.put("three", 3); System.out.println("Value for 'one': " + hashTable.get("one")); System.out.println("Size of hash table: " + hashTable.size()); hashTable.remove("one"); System.out.println("Value after removing 'one': " + hashTable.get("one")); } } 

Output:

Value for 'one': 1 Size of hash table: 3 Value after removing 'one': null 

Explanation:

1. The KeyValuePair class is a simple container to hold both a key and its corresponding value.

2. The HashTable class is our main class implementing the hash table. It contains a table of LinkedList to handle collisions using chaining.

3. The hash() function determines the index in the table for a given key.

4. The get() method retrieves the value for a given key.

5. The put() method inserts a new key-value pair or updates the value if the key already exists.

6. The remove() method removes the key-value pair from the hash table and returns the value of the removed key.

7. The size() method returns the number of key-value pairs in the hash table.

8. The main() function demonstrates the basic operations (put, get, and remove) of the hash table.


Comments