package com.jl.testmap; /** * 自定义一个HashMap * @author JiangLai * */ public class MyHashMap<K,V> { Node<K,V>[] table;//位桶数组 int size;//存放键值对的个数 public MyHashMap() { table = new Node[16];//长度一般定义为2的整数次幂 } public void put(K key,V value) { //定义新的节点对象 Node newNode = new Node(); newNode.hash = myHash(key.hashCode(), table.length); newNode.key = key; newNode.value = value; newNode.next = null; Node temp = table[newNode.hash]; Node itorLast = null;//正在遍历的最后一个元素 if(temp==null) { //此处数组元素为空,则直接将新节点放入 table[newNode.hash] = newNode; size++; }else { //此处数组元素 不为空,则遍历整个链表 while (temp!=null) { //判断key是否重复,相同则替换, if(temp.key.equals(key)) { temp.value = value;//只是覆盖value即可,其他的值不变。(hash,key,next) break; }else {//如果不重复,则遍历下一个 itorLast = temp; temp = temp.next; } } if(itorLast!=null) { itorLast.next = newNode; size++; } } } public V get(K key) { int hash = myHash(key.hashCode(), table.length); Object value = null; if(table[hash] != null) { Node<K,V> temp = table[hash]; while (temp!=null) { if(temp.key.equals(key)) {//如果相等,则返回对应的值 value = temp.value; break; }else { temp = temp.next; } } } return (V)value; } //计算Hash值 public int myHash(int v,int length) { //二者作用一样 // System.out.println(v&(length-1));//直接位运算,效率高. // System.out.println(v%(length-1));//取余运算,效率低. return v&(length-1); } @Override public String toString() { //{10:aa,20:bb} StringBuilder sb = new StringBuilder("{"); //遍历数组 for(int i=0;i<table.length;i++) { Node<K,V> temp = table[i];//当前元素 //遍历链表 while (temp!=null) { //当前元素的key和value 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> map01 = new MyHashMap<>(); map01.put(10, "001"); map01.put(20, "002"); System.out.println(map01); System.out.println(map01.get(10)); } }
package com.jl.testmap; /** * 用于TestHashMap中 * @author JinagLai */ public class Node<K,V> { int hash;//HashCode K key;//键 V value;//值 Node<K,V> next;//下一个节点 }