找了一个视频,上面老师详细的介绍了hashmap的原理。老师一边讲,我就一边想,这不就是我自考的时候考的数据结构的那一部分嘛!!理解起来也就上手了很多。下面就把手写的hashmap保存下来。万一面试用到呢!
1)、什么是hash?
它是将一个任意长度的二进制值通过一个映射关系转换成一个固定长度的二进制值。
固定长度的二进制值就相当于一个关键字,是对任意长度的二进制值的摘要----key
真正有效的数据是任意长度的二进制----value
2)、hash的作用:一个key和一个value的唯一映射关系。
3)、实现用的是除留余数法,公式如下: int index=key%m;
用的链表形式解决存储冲突问题
实现如下:
先定义一个hashmap的接口。用的英文名字命名吧:
public interfaceERMap<K,V> {
Vput(K key,V value);
Vget (K key);
intsize();
//定义一个内部接口
//可以根据Entry对象拿到这个对象的key和value
interfaceEntry<K,V>{
KgetKey();
VgetValue();
}
}
然后定义一个实现类:
public class ERHashmap<K,V> implements ERMap<K, V> {
private static Integer defaultLength = 16;//定义数组长度(定义成2的倍数)
private static double defaultLoad=0.75;//定义负载因子(超过这个因子就会扩容)
private Entry<K,V>[] table =null;//定一个数组,盛放Entry对象
private int size=0;//定义一个常量,用来记录数组元素个数
//定义构造函数,
ERHashmap(int defaultLength,double defaultLoad){
this.defaultLength=defaultLength;
this.defaultLoad=defaultLoad;
table=new Entry[defaultLength];//定义一个默认数组,长度就是传过来的长度
}
ERHashmap(){
this(defaultLength,defaultLoad);
}
public V put(K key, V value) {
//得到要放的数据的位置:也就是数组的下标
int index=this.getIndex(key);
//根据这个下标判断该数据是否有数据
Entry<K,V> e =table[index];
if(null==e){
table[index]=new Entry(key,value,null,index);
size++;//数组长度加1
}else{
Entry newEntry =new Entry(key,value,e,index);
table[index] = newEntry;
}
return table[index].getValue();
}
//找数组下标的方法
private int getIndex(K key){
//除留取余数法
//m的取值是比数组长度小的质数的最大值
//这里定义的长度为16,那么m就是13
int m=this.defaultLength-3;
return key.hashCode() % m;
}
public V get(K key) {
//得到要放的数据的位置:也就是数组的下标
int index=this.getIndex(key);
return table[index]==null ? null:table[index].getValue();
}
public int size() {
return size;
}
class Entry<K,V> implements ERMap.Entry<K, V>{
K key;
V value;
Entry<K,V> next;
int index;//记录下标
Entry(K k,V v,Entry<K,V> n,int inx){
key=k;
value=v;
index=inx;
next=n;//数组第一个元素的下一个元素
}
public K getKey(){
return key;
}
public V getValue(){
return value;
}
}
}
测试类,查看是不是可以用:
public class test {
public static void main (String[] args){
ERHashmap map = newERHashmap();
map.put("jack","haha !!!");
map.put("star", "jjjjjj");
System.out.println("JACK START"+map.get("jack"));
System.out.println(map.get("star"));
}
}
运行之后,结果如下: