/**
*结点类
*
**/
public class Node01<K,V> {
int hash;
K key;
V value;
Node01<K,V > next;
}
/**
* 手动实现hashMap
* put和get方法
* @author Uosu
*
* @param <K>
* @param <V>
*/
public class myHashMap<K, V> {
Node01[] table;// 位桶數組
int size; // 存放键值对的个数
public myHashMap() {
table = new Node01[16];// 长度一般定义为2的幂次方
}
public V get(K key) {
int hash = myhash(key.hashCode(), table.length);
/*将哈希值和数组长度联系起来
* 取余法
* 如53%16=y;
* 97%16=y;
* 则将哈希值为53,和97的key放在同一数组中
*
* */
V value = null;
if (table[hash] != null) {
Node01 temp = table[hash];
while (temp != null) {
if (temp.key.equals(key)) {
value = (V) temp.value;
break;
} else {
temp = temp.next;
}
}
}
return value;
}
public void put(K key, V value) {
// 定义新的节点对象
Node01<K, V> newNode = new Node01<K, V>();
newNode.hash = myhash(key.hashCode(), table.length);
newNode.key = key;
newNode.value = value;
newNode.next = null;
Node01 temp = table[newNode.hash]; // temp 等于数组中的元素 若数组为空,temp为空...
Node01 iterLast = null; // 最后最后一个节点
boolean keyRepeat = false;//判断key是否重复,若不重复则将newNode放在最后
if (temp == null) {
table[newNode.hash] = newNode;
size++;
} else {
// 数组不为空,则形成链表
while (temp != null) {
if (temp.key.equals(key)) { // 若key相等则覆盖 ,value变其他的不变
temp.value = value;
keyRepeat = true;
break;
} else {
iterLast = temp;
temp = temp.next;
}
}
if (!keyRepeat) {// 如果没有发生key重复
iterLast.next = newNode;
size++;
}
}
}
//重写toString方法 {1:ll,2:ss}
@Override
public String toString() {
StringBuffer sb=new StringBuffer("{");
for (int i = 0; i < table.length; i++) {
Node01 temp=table[i]; //先遍历数组
while(temp!=null) { //再遍历链表
sb.append(temp.key+":"+temp.value+",");
temp=temp.next;
}
}
sb.setCharAt(sb.length()-1,'}');
return sb.toString();
}
public static void main(String[] args) {
myHashMap<Integer, String> m=new myHashMap<Integer, String>();
m.put(1001, "tan");
m.put(1002, "wu");
m.put(1003, "yu");
m.get(1002);
System.out.println(m.get(1002));
System.out.println(m);
}
public static int myhash(int key, int length) {
return key& length - 1; //按位取余,效率高
}
}