import java.util.TreeMap;
//这整个就是用treemap来实现哈希表
//哈希表实际上就是一个数组 但是这个数组的每个元素都包含了一个treemap 在Java的源码当中
//数组包含的是链表 但是在数的不断加入中 链表会改为treemap 因为数的量级比较小的时候 用链表更方便
//当数的量级大的时候 用treemap就更方便了
//哈希表会将每个我们放入的key变成一个值 这个是通过里面的hash完成的 每个Java的继承了obj obj
//会为我们写hashcode方法 所以只要我们将我们设置的任何的变量或者类型传入到hash()中
//它都会为我们变成一个值 这个值就是数组的索引
//并且这个可能会有相同的值产生 所以我们将每个数组的元素都设置为treemap 这样就实现了哈希表
public class Hashtable<K,V> {
private TreeMap<K,V> [] hashtable;
private int size;
private int m;//这里的m是用来表示开辟的数组的空间的大小
public Hashtable(int m){
this.m=m;
size=0;
hashtable=new TreeMap[m];//这里就可以看出来了 其实哈希表的底层就是一个数组 但是这个数组的每个
//位置上都代表2叉树
for (int i=0;i<m;i++){
hashtable[i]=new TreeMap<>();
}
}
public Hashtable(){
this(90);//这个只是随便写的 其实这个东西应该是要根据你所要存放的数据的规模进行查表得到的
//这里只是为了简便
}
private int hash(K key){
return (key.hashCode()&0x7fffffff)%m;//这里的作用就是为了让传入的值在进行hashcode后得到的不管是
//负数还是正数 使结果都为正数
}
public int getsize(){
return size;
}
public void add(K key ,V value){
if(hashtable[hash(key)].containsKey(key))
hashtable[hash(key)].put(key, value);
else {
hashtable[hash(key)].put(key, value);
size++;
}
}
public V remove(K key){
V a=null;
if(hashtable[hash(key)].containsKey(key)){
a=hashtable[hash(key)].get(key);
hashtable[hash(key)].remove(key);
}
return a;
}
public boolean contains(K key){
return hashtable[hash(key)].containsKey(key);
}
public void set(K key,V value){
if(hashtable[hash(key)].containsKey(key)){
hashtable[hash(key)].put(key, value);
}
else System.out.println("此时出现异常 但是我不会Java的异常 就这样了");
}
public V get(K key){
return hashtable[hash(key)].get(key);
}
}
2021java基于treemap实现哈希表(有注释和解释)
最新推荐文章于 2022-07-11 13:51:22 发布