哈希桶解决哈希冲突:
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"));
}
}