hash表的使用

事实上不管使用数组还是链表存储数据都会存在较大缺陷,
当你使用数组时,难于删除和添加数据
当你使用链表时难于查找数据

因此hash表综合了两者的优缺点,使的查找和添加等操作既不至于复杂也不至于简单。
因此hash表的原理可以是数组中存链表,链表上存数据
简单的建立方式如下:

public class HNode{
		public HNode(Item data){
			this.data=data;
		}
		Item data;
		HNode next;
		HNode parent;
		
}//链表
public class Item {
		public Item(int key,String value){
			this.key=key;
			this.value=value;
		}
		int key;
		String value;
}//数据
public class MyHash {
	private HNode[] memo=new HNode[32];//数组
	private int count=0;
	}//hash表的的简单形式

上面所形成的hash表可以用下图表示

在这里插入图片描述

hash表的数据添加与查找

其实也就是之前的数组与链表添加方式,查找也一样。。
添加

public void put(int key,String value){
		Item it=new Item(key,value);
		HNode node=new HNode(it);
		int index=hashIndex(key);
		if(memo[index]!=null){
			memo[index].parent=node;
			memo[index]=node;
		}else{memo[index]=node;}/*数组下无数据时直接存入,
		反之作为该数组的下个节点存入*/
		count++;
		int t=count/memo.length;
		if(t>2){
			HNode[] memo_2=new HNode[3*memo.length];
			for(int i=0;i<memo.length;i++){
				memo_2[i]=memo[i];
			}
			memo=memo_2;
		//存储次数超过数组长度的三倍时就将数组变长三倍	
		}
		
	}
	public int size(){
		return count;
	}
	public int length(){
		return memo.length;
	}

查找

public String get(int key){
		int index=hashIndex(key);
		Item item=memo[index].data;
		return item.value;/*这样只是取到了数组下的数据,
		取节点的数据则要再用链表的方式(上一个博客)*/
	}

用上述方法运行此串代码:

public static void main(String[] args){
		MyHash hb=new MyHash();
		
		int k1=7773;String v1="AAAAA"; 
		int k2=234;String v2="BBBBB"; 
		int k3=1221;String v3="CCCCC"; 
		int k4=343;String v4="DDDDD";  
		for(int i=0;i<100;i++){
		hb.put(k1, v1);  
		}
		hb.put(k2, v2);   
		hb.put(k3, v3);    
		hb.put(k4, v4);
		
		int count =hb.size();
		String word=hb.get(k2);
		String word_1=hb.get(k4);
		System.out.println("数组长度"+hb.length());
		System.out.println("数量"+count);
		System.out.println(k2+"get:"+word);
		System.out.println(k4+"get:"+word_1);
	}

结果如下:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值