import java.util.TreeMap;
public class MyHashTable<K,V> {
//哈希表就是 TreeMap的数组
private TreeMap<K,V>[] hashTable;
//哈希表 有多少个地址
private int M;
//
private int size;
//触发扩容
private static final int up=10;
//触发缩容
private static final int down=2;
private static final int first=7;
//构造参数
public MyHashTable(int m){
this.M = m;
size = 0;
hashTable = new TreeMap[m];
for(int i=0;i<m;i++)
hashTable[i]=new TreeMap<>();
}
public MyHashTable(){
this(99);
}
//哈希函数
private int hash(K key){
//取出负号
return key.hashCode() & 0x7fffffff;
}
public int getSize(){
return size;
}
//添加元素
public void add(K key,V value){
TreeMap<K ,V> ad = hashTable[hash(key)];
if(ad.containsKey(key))
ad.put(key,value);
else{
ad.put(key,value);
size++;
//是否需要扩容
if((size/M)>=up)
resize(M*2);
}
}
//删除操作
public V remove(K key){
TreeMap<K,V> rm = hashTable[hash(key)];
V value=null;
if(rm.containsKey(key)){
rm.remove(key);
size--;
//是否需要缩容
if(size/M <=down && M/2>=first)
resize(M/2);
}
return value;
}
//修改
public void set(K key,V value){
TreeMap<K,V> set = hashTable[hash(key)];
if(!set.containsKey(key))
throw new IllegalArgumentException("no key");
set.put(key,value);
}
//查询
public V get(K key){
return hashTable[hash(key)].get(key);
}
//是否包含
public boolean isCon(K key){
return hashTable[hash(key)].containsKey(key);
}
//重置size
private void resize(int newM){
//创建一个newM的数组
TreeMap<K,V>[] newT = new TreeMap[newM];
//给新创建的数组初始化
for(int i =0;i<newM;i++)
newT[i] = new TreeMap<>();
int oldM = M;
this.M = newM;
for(int i = 0;i<oldM;i++){
//找到红黑树
TreeMap<K,V> tree = hashTable[i];
for(K key:tree.keySet()){
newT[hash(key)].put(key,tree.get(key));
}
}
this.hashTable=newT;
}
}