2021java基于treemap实现哈希表(有注释和解释)

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);
    }

}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值