java数据结构 hashmap开放地址法

本文探讨了在Java中使用HashMap时遇到的哈希冲突问题,特别是通过开放地址法来解决冲突的原理和实践。内容指出,由于哈希函数可能导致相同的hashCode,开放地址法通过线性探测寻找空位插入数据,但这种方法可能占用其他元素的位置,存在一定的缺陷。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

采用压缩可选值后,容易产生相同的hashCode,如a==ct

开放地址法:当冲突发生时,通过依次查找数组的一个空位,将数据填入。

1、插入数据

<pre name="code" class="java">	/*
	 * 插入数据
	 */
	public void insert(Info info){
		//获得关键字
		String key=info.getKey();
		//关键字对应的哈希数
		int hashVal=hashCode(key);
		//如果arr[hashVal]没被占用过,或占用过但已删除
		while(arr[hashVal]!=null&&arr[hashVal].getName()!=null){
			hashVal++;
			hashVal%=arr.length;
		}	
		arr[hashVal]=info;
	}


 

2、查找数据

	/*
	 * 查找数据
	 */
	public Info find(String key){
		int hashVal=hashCode(key);
		while(arr[hashVal]!=null){
			if(arr[hashVal].getKey().equals(key)){
				return arr[hashVal];
			}
			hashVal++;
			hashVal%=arr.length;
		}
		return null;
	}

3、删除数据

	/*
	 * 删除数据
	 */
	public Info delete(String key){
		int hashVal=hashCode(key);
		while(arr[hashVal]!=null){
			if(arr[hashVal].getKey().equals(key)){
				Info tmp=arr[hashVal];
				tmp.setName(null); //将name置空
				return tmp;
			}
			hashVal++;
			hashVal%=arr.length;
		}
		return null;
	}

缺陷:占用了别人的位置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值