使用线性地址法模拟hashMap的put方法
数据结构类型:采用数组
存储数据类型:键值对形式
数据类型设计
//Entry类 提供键和值
static class Entry<K,V>{
private K key;
private V value;
public Entry() {
}
public Entry(K key, V value) {
this.key=key;
this.value=value;
}
}
创建的对象及其属性值
//数组初始化默认值设为16
Entry[] element=new Entry[16];
//数据的个数
private int size;
put方法的具体实现
//加入数据
public void put(K key, V value) {
//判断是否需要扩容
if ((double)size/element.length>=0.75){
//扩容大小为与原来的两倍
Entry[] newelement=new Entry[element.length*2];
repush(newelement);
element=newelement;
}
int index=key.hashCode()%element.length;
if (element[index]!=null){
//处理hash冲突,从当前的hashCode对应数组的位置从左到右找数组中的空闲位置添加数据
for (int i = (index+1)%element.length; i !=index; i=++i%element.length) {
if (element[i]==null){
element[i]=new Entry(key,value);
size++;
break;
}
}
}else {
element[index] = new Entry(key,value);
size++;
}
}
重新hash函数
//扩容
public void repush(Entry[] newarray){
size=0;
//把为扩容前数组中的数组进行添加到新的数组中
for (int i = 0; i <element.length; i++) {
//重新计算原来数组中key的hashCode值
int index = element[i].key.hashCode() % newarray.length;
if (newarray[index]!=null){
//处理hash冲突
for (int j = (index+1)%newarray.length; j !=index ; j=++j%newarray.length) {
if (newarray[j]==null){
newarray[j]=element[i];
break;
}
}
}else {
newarray[index]=element[i];
}
size++;
}
}