自定义HashMap
方案采用:
定址:除留余数法
冲突:拉链法
自动扩容:threshHold阈值,超过容量0.8则自动扩容
![简单HashMap数据结构](https://img-blog.csdnimg.cn/20200808210348742.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxOTM5MDk5,size_16,color_FFFFFF,t_70)
public class MyHashMap<K,V> {
Node<K,V>[] table;
int size = 8;
int threshHold = 0;
public MyHashMap() {
table = new Node[size];
}
public void put(K key, V value) {
resize();
Node<K,V>[] tab = table; Node<K,V> tabNode; int index;
int hash = hash(key);
if ((tabNode = tab[index = (size - 1) & hash]) == null)
tab[index] = new Node(hash, key, value, null);
else {
Node<K,V> temp; K k;
if (tabNode.hash == hash && ((k = tabNode.key) == key || (key != null && key.equals(k))))
tabNode.setValue(value);
else {
for (int Count = 0; ; ++Count) {
if ((temp = tabNode.next) == null) {
tabNode.next = new Node(hash, key, value, null);
break;
}
if (temp.hash == hash && ((k = temp.key) == key || (key != null && key.equals(k)))) {
temp.setValue(value); break;
}
tabNode = temp;
}
}
}
threshHold++;
}
public V get(K key) {
int hash = hash(key);
Node<K, V> tabNode = table[(size - 1) & hash];
if(tabNode == null)
return null;
K k;
for (int Count = 0; ; ++Count) {
if (tabNode.hash == hash && ((k = tabNode.getKey()) == key || key.equals(k))) {
return tabNode.getValue();
}
if((tabNode = tabNode.next) == null) {
return null;
}
}
}
public void resize() {
if(threshHold < size * 0.75)
return ;
else {
Node<K,V>[] newTab; int newCap = size * 2;
Node<K,V>[] oldTab = table; int oldCap = size;
size = newCap;
newTab = new Node[size];
for (int j = 0; j < oldCap; ++j) {
Node<K,V> e;
if ((e = oldTab[j]) != null) {
oldTab[j] = null;
if (e.next == null)
newTab[e.hash & (newCap - 1)] = e;
else {
Node<K,V> insertNode; Node<K,V> newTabNode;
Node<K,V> next;
do {
next = e.next; insertNode = e; insertNode.next = null;
if (newTab[(newCap - 1) & insertNode.hash] == null)
newTab[(newCap - 1) & e.hash] = insertNode;
else {
newTabNode = newTab[(newCap - 1) & insertNode.hash];
while(newTabNode.next != null)
newTabNode = newTabNode.next;
newTabNode.next = insertNode;
}
} while ((e = next) != null);
}
}
}
table = newTab;
}
}
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
class Node<K,V>{
K key;
V value;
Node<K,V> next;
final int hash;
Node(int hash, K key, V value, Node<K,V> next) {
this.hash = hash;
this.key = key;
this.value = value;
this.next = next;
}
public K getKey() {
return key;
}
public void setKey(K key) {
this.key = key;
}
public V getValue() {
return value;
}
public void setValue(V value) {
this.value = value;
}
@Override
public boolean equals(Object obj) {
if(obj == this)
return true;
if(obj instanceof Node) {
Node objRepalce = (Node)obj;
if(objRepalce.key.equals(this.key) && objRepalce.value.equals(this.value)) {
return true;
}
}
return false;
}
}
public static void main(String[] args) {
MyHashMap hs = new MyHashMap();
hs.put(" ", "123");
hs.put("aaa", "aaa");
hs.put("hhh", "bbb");
hs.put("add", "bbb");
hs.put("put", "bbb");
hs.put("hello", "bbb");
hs.put("777", "bbb");
hs.put("2f5d", "ccc");
hs.put("38", "bbb");
System.out.println(hs.get(" "));
}
}