哈希桶解决哈希冲突:
import java.util.Arrays; import java.util.Objects; public class HashBucket<K,V> { static class Node<K,V> { public K key; public V val; public Node<K,V> next; public Node(K key, V val) { this.key = key; this.val = val; } } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; HashBucket<?, ?> that = (HashBucket<?, ?>) o; return usedSize == that.usedSize && Arrays.equals(array, that.array); } @Override public int hashCode() { int result = Objects.hash(usedSize); result = 31 * result + Arrays.hashCode(array); return result; } public Node[] array; public int usedSize; public HashBucket() { this.array = new Node[8]; } public void put(K key, V val) { Node<K,V> node = new Node<K,V>(key,val); int hash = key.hashCode(); int index = hash % array.length; Node<K,V> cur = array[index]; while (cur != null) { if (cur.key.equals(key)) { cur.val = val; return; } cur = cur.next; } node.next = array[index]; array[index] = node; this.usedSize++; if (loadFactor() >= 0.75) { resize(); } } //扩容 public void resize() { Node[] newArray = new Node[array.length * 2]; //遍历原来的数组,每个元素重新进行哈希 for (int i = 0; i < array.length; i++) { Node<K,V> cur = array[i]; while (cur != null) { int hash = cur.hashCode(); int index = hash % newArray.length; Node<K,V> curNext = cur.next; cur.next = newArray[index]; newArray[index] = cur; cur = curNext; } } } //求负载因子 public double loadFactor() { return usedSize * 1.0 / array.length; } public V get(K key) { int hash = key.hashCode(); int index = hash % array.length; Node<K,V> cur = array[index]; while (cur != null) { if (cur.key == key) { return cur.val; } cur = cur.next; } return null;//没找到 } public static void main(String[] args) { HashBucket<String,Integer> hashBucket = new HashBucket<>(); hashBucket.put("zm",1); hashBucket.put("zm2",2); System.out.println(hashBucket.get("zm2")); } }