参考了JDK1.8源码,自己实现一个简单的,源码里有很多位运算。我这里化为简单的实现了。
这里使用1.8以后的尾插法。
只实现了 put 、resize、get方法。
package com.meng.hashmap;
public class MyHashMap {
private Entry[] table;
private static int initialCapacity = 16;
private static double loadFactor = 0.75;
private int size;
public MyHashMap() {
table = new Entry[initialCapacity];
}
public Object put(Object key, Object val) {
Entry entry = new Entry(key, val);
int index = key.hashCode() % table.length;
if (table[index] == null) {
table[index] = entry;
size++;
} else {
Entry e;
for (e = table[index]; e != null; e = e.next) {
if (entry.key.hashCode() == e.key.hashCode() && key.equals(e.key)) {
Object oldValue = e.val;
e.val = val;
return oldValue;
}
}
e = entry;
size++;
}
if (size > table.length * loadFactor) {
resize();
}
return null;
}
private void resize() {
int newCapacity = table.length * 2;
Entry[] newTable = new Entry[newCapacity];
Entry[] cur = table;
for (int i = 0; i < cur.length; i++) {
Entry curNum = cur[i];
if (curNum != null) {
Entry e = curNum;
do {
Entry next = e.next;
int newIndex = e.key.hashCode() % newCapacity;
newTable[newIndex] = e;
e.next = null;
e = next;
} while (e != null);
}
}
table = newTable;
initialCapacity = newCapacity;
}
public Object get(Object key) {
int index = key.hashCode() % table.length;
if (table[index] == null) {
return null;
} else {
Entry e;
for (e = table[index]; e != null; e = e.next) {
if (key.hashCode() == e.key.hashCode() && key.equals(e.key)) {
return e.val;
}
}
}
return null;
}
static class Entry {
Object key;
Object val;
Entry next;
Entry(Object k, Object v) {
key = k;
val = v;
}
}
public static void main(String[] args) {
MyHashMap extHashMap = new MyHashMap();
extHashMap.put("1号", "00");// 0
extHashMap.put("2号", "00");// 1
extHashMap.put("3号", "00");// 2
extHashMap.put("4号", "00");// 3
extHashMap.put("6号", "6号");// 4
extHashMap.put("7号", "00");
extHashMap.put("14号", "00");
extHashMap.put("22号", "00");
extHashMap.put("26号", "26号");
extHashMap.put("27号", "00");
extHashMap.put("28号", "00");
extHashMap.put("66号", "00");
extHashMap.put("26号", "^^^^^");
extHashMap.print();
System.out.println("============================");
extHashMap.put("30号", "00");
extHashMap.print();
System.out.println(extHashMap.get("26号"));
}
public void print() {
for (int i = 0; i < table.length; i++) {
System.out.print("下标[" + i + "] ");
for (Entry e = table[i]; e != null; e = e.next) {
System.out.print("【key = " + e.key + ",value = " + e.val + "】 ");
}
System.out.println();
}
}
}