java实现散列表

本文介绍了一种基于散列函数实现的散列表,并详细解释了如何通过链接法解决散列表中的碰撞问题。通过具体代码示例展示了散列表的插入、查找及删除操作。

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

在直接寻址的情况下,具有关键字k的元素被存储在槽k中。比方说关键字域有2,3,5,8四个数,那么它只能被存储在2,3,5,8四个位置,其他的位置全部都被浪费掉了,这时候就可以通过散列函数h,将关键字域中的元素映射到散列表[0,m-1]的位置上。

这时候内存的花销就大大的减少了。

在JDK中已经有一个HashTable了,为了更加深刻的理解hash表,这里我们来自己实现一下:

散列函数定义为:

index=key%16;

通过链接法来解决碰撞问题:

下面是实现的

package bb;

public class HashEntry {
	public Integer key=null;
	public Object value=0;
	public HashEntry next=null;
	public HashEntry pre=null;

}
package bb;

import java.util.ArrayList;

public class MHashTable {
	private int size=16;
	private ArrayList<HashEntry> arrayList=new ArrayList<HashEntry>();
	

	public MHashTable() {
		for(int i=0;i<size;i++){
			arrayList.add(i,null);
		}
	}

	public ArrayList<HashEntry> getContainer(){
		return  arrayList;
	}
	public int getIndex(int key){
		return key%16;
	}
	
	public boolean insert(Integer key,int value){  
	    if(get(key)!=null){  
	        return false;  
	    }  
	    int theLocIndex=getIndex(key);  
	    if(theLocIndex>=16){  
	        return false;  
	    }  
	    if(arrayList.get(theLocIndex)==null){  
	        HashEntry curEntry=new HashEntry();  
	        curEntry.key=key;  
	        curEntry.value=value;  
	        arrayList.remove(theLocIndex);  
	        arrayList.add(theLocIndex,curEntry);  
	        return true;  
	          
	    }  
	    else if(arrayList.get(theLocIndex)!=null){  
	        HashEntry cEntry=arrayList.get(theLocIndex);  
	        HashEntry preEntry1=cEntry;  
	        while(cEntry!=null){  
	            preEntry1=cEntry;  
	            cEntry=cEntry.next;  
	        }  
	        HashEntry newEntry=new HashEntry();  
	        newEntry.pre=cEntry;  
	        newEntry.key=key;  
	        newEntry.value=value;  
	        preEntry1.next=newEntry;  
	        return true;  
	    }  
	    return false;  
	}  
	  
	public HashEntry get(Integer key){  
	    int theLocIndex=getIndex(key);  
	    if(arrayList.get(theLocIndex)==null){  
	        return null;  
	    }  
	    else{  
	        HashEntry cEntry=arrayList.get(theLocIndex);  
	        while (cEntry!=null) {  
	            if(cEntry.key==key){  
	                return cEntry;  
	            }  
	            else{  
	                cEntry=cEntry.next;  
	            }  
	              
	        }  
	        return null;  
	          
	    }  
	}  
	  
	public boolean remove(int key){  
	    int theLocIndex=getIndex(key);  
	    if(arrayList.get(theLocIndex)==null){  
	        return false;  
	    }  
	    else{  
	        HashEntry cEntry=arrayList.get(theLocIndex);  
	        while (cEntry!=null) {  
	            if(cEntry.key==key){  
	                if(cEntry.pre==null){  
	                	arrayList.remove(theLocIndex);  
	                    return true;  
	                }else{  
	                    cEntry.pre.next=cEntry.next;  
	                    return true;  
	                }  
	            }  
	            else{  
	                cEntry=cEntry.next;  
	            }  
	              
	        }  
	        return false;  
	          
	    }     
	}  
	  
	public boolean edit(int key,int value){  
	    HashEntry cEntry=get(key);  
	    if(cEntry==null){  
	        return false;  
	    }  
	    cEntry.value=value;  
	    return true;  
	}  
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MHashTable mHashTable=new MHashTable();
		mHashTable.insert(1, 2);
		mHashTable.insert(17, 3);
		System.out.println(mHashTable.get(1));
		System.out.println(mHashTable.get(17));
	}

}

做了一个简单的碰撞测试,最后是输出结果,显然这两个地址是不一样的



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值