一:引言
HashMap是Map的实现类,其方法都可以继承Map,不用手写,本篇只是为了了解底层代码和复习java基础敲得码
二:上码
package cn.wyj.two;public class Demo5_手写HashMap<K,V> {Node2 table[];//位桶数组int size;public Demo5_手写HashMap(){table = new Node2[16];//数组长度一般设置成 2 的整数幂}//向容器当中存入数据public void put(K key,V value){Node2 newNode = new Node2(); newNode.hash = myHash(key.hashCode(), table.length);newNode.key = key;newNode.value = value;newNode.next = null;Node2 temp = table[newNode.hash];Node2 lastnode = null;//表示链表当中最后一个元素boolean keyRepeat = false;if( temp == null){//此处数组元素为空,则直接将新节点放进去table[newNode.hash] = newNode;size++;}else{//此处数组元素不为空,则遍历对应的链表while(temp != null){//如果新节点的键值 等于 该该链表当中的数据 则覆盖if(temp.key.equals(key)){temp.value = value;keyRepeat = true;break;}else{//key不重复lastnode = temp;temp = temp.next;}}if(!keyRepeat){lastnode.next = newNode;size++;}}}//根据键值 get 关键值public V get( K key ){int hash = myHash((key.hashCode()), table.length);V value = null;if(table[hash] != null){Node2 temp = table[hash];while(temp != null){if(temp.key.equals(key)){value = (V)temp.value;break;}else{temp = temp.next;}}}return value;}//数据的哈希地址public int myHash(int v,int length){return v&(length - 1);//只是位运算 效率高 其效果与取模运算一样(v%(length - 1))}@Overridepublic String toString() {// TODO Auto-generated method stubStringBuilder sb = new StringBuilder();sb.append("{");//数组的 循环for(int i = 0; i < table.length; i++){Node2 temp = table[i];while( temp != null ){sb.append(myHash(temp.key.hashCode(), table.length) +" "+temp.value+',');temp = temp.next;}}sb.setCharAt(sb.length() - 1, '}'); return sb.toString();}public static void main(String[] args) {// TODO Auto-generated method stubDemo5_手写HashMap<Integer,String> m = new Demo5_手写HashMap<Integer,String>();m.put(10, "aa");m.put(20, "bb");m.put(30, "cc");m.put(20, "wyj");m.put(53, "10");m.put(69, "20");m.put(85, "30");// for(int i = 10; i < 100; i++)
// {
// System.out.println(i+"---"+m.myHash(i,16));//53 69 85 对16取余的结果都为 5;
// }System.out.println(m.size);//6个就对了有一个重复了System.out.println(m.get(85));System.out.println(m);}}
如有疑问欢迎留言! 加油陌生人!