Implementing HashSet in Java.
public class HashSet<K> {
public static class Node<K> {
final K key;
Node next;
public Node(K key, Node next) {
this.key = key;
this.next = next;
}
}
private int size = 0;
private int capacity = 16;
private Node[] tab;
public HashSet(int capacity) {
this.capacity = capacity; // should check range, make it 2^n
tab = new Node[this.capacity];
}
private int indexOf(K key) {
int hash = key == null ? 0 : key.hashCode();
return hash % this.capacity;
//return hash & (tab.length-1);
}
public boolean add(K key) {
int idx = indexOf(key);
Node<K> node = tab[idx];
if(node == null) {
tab[idx] = new Node(key, null);
} else if(node.key == key || (key != null && key.equals(node.key))) {
return false;
} else {
tab[idx] = new Node(key, node);
}
size++;
return true;
}
public boolean remove(K key) {
int idx = indexOf(key);
Node<K> node = tab[idx];
if(node != null && (node.key == key || (key!=null && key.equals(node.key)))) {
tab[idx] = node.next;
size--;
return true;
}
Node<K> pre = node;
while(node != null) {
if(node.key == key || (key!=null && key.equals(node.key))) {
pre.next = node.next;
size--;
return true;
}
pre = node;
node = node.next;
}
return false;
}
public boolean contains(K key) {
int i = indexOf(key);
Node node = tab[i];
while(node != null) {
if(node.key == key || (key!=null && key.equals(node.key))) {
return true;
}
node = node.next;
}
return false;
}
public int size() {
return size;
}
// test cases
public static void main (String[] args) {
HashSet<Integer> set = new HashSet<>(16);
System.out.println(set.size());
set.add(null);
System.out.println(set.contains(null));
System.out.println(set.size());
set.add(1);
set.add(1);
set.add(2);
System.out.println(set.contains(2));
System.out.println(set.size());
set.remove(1);
System.out.println(set.contains(1));
System.out.println(set.size());
}
}