一:引言
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))
}
@Override
public String toString() {
// TODO Auto-generated method stub
StringBuilder 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 stub
Demo5_手写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);
}
}
如有疑问欢迎留言! 加油陌生人!