线性地址法

本文详细介绍了如何使用线性地址法来模拟HashMap的put方法,包括数据结构设计、键值对存储、冲突解决策略以及扩容机制。在数据结构中,采用了Entry静态内部类来存储键值对,并通过数组存储这些Entry对象。当哈希表负载因子达到0.75时,会触发扩容,扩容后将原有元素重新哈希到新数组中。在处理哈希冲突时,采用线性探测再散列的方法,从当前位置开始寻找下一个空闲位置插入数据。
摘要由CSDN通过智能技术生成

使用线性地址法模拟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++;
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值