用java纯手工敲出模拟HashMap和HashSet(java小练习)

通过了解HashMap类底层代码后,通过自己的理解手动完成HashMap中的主要方法,提高java基础。

/**
 * 自定义HashMap
 * 完成myHash函数实现计算hash值
 * 完成put方法实现(核心方法)
 * 重写toString 实现格式化输出
 * 完成get方法(核心方法)
 * 加入泛型
 * @author yky
 *
 */
class Node<k,v>{
	//每个节点特定值
	int hash;
	k key;
	v value;
	Node next;
}

public class MyHashMep <k,v>{
	Node[] table;//核心   位桶数组
	int size;//键对个数
	public MyHashMep(){
		this.table=new Node[16];//默认大小
	}
	public void put(k key,v value) {
		Node newNode=new Node();
		newNode.hash=myHash(key.hashCode(),table.length);//当前hash值
		newNode.key=key;
		newNode.value=value;
		newNode.next=null;
		Node LastNode = null;  //保存最后一个temp值
		boolean isRepeat=false;
		Node temp=table[newNode.hash];//取出当前hash值的最先节点
		if(temp==null) {
			table[newNode.hash]=newNode;
			size++;
		}else {
			while(temp!=null) {
				//判断key值相同要覆盖
				//不等直接在后面添加新节点
				if(temp.key.equals(key)) {
					temp.value=value;//直接覆盖
					isRepeat=true; 
					break;
				}else {
					LastNode=temp;
					temp=temp.next;
				}
				
			}
			if(!isRepeat) {
				//如果没有发生重复加在最后
				LastNode.next=newNode;
				size++;
			}
		}
	}
	public int myHash(int v,int length) {//实现hash值计算算法
		return v&(length-1);
	}
	public String toString() {
		StringBuilder sb=new StringBuilder();
		sb.append("[");
		for(int i=0;i<table.length;i++) {
			Node temp=table[i];
			while(temp!=null) {
				sb.append(temp.key+":"+temp.value+",");
				temp=temp.next;
			}
		}
		return sb.toString();
	}
	public Object get(k key) {
		int hash=myHash(key.hashCode(),table.length);
		v value=null;
		if(table[hash]!=null) {
			Node temp=table[hash];
			while(temp!=null) {
				if(temp.key.equals(key)) {
					//如果key相等说明找到了
					value=(v)temp.value;
					break;
				}else {
					temp=temp.next;
				}
			}
		}
		return value;
	}
	public static void main(String[] args) {
		MyHashMep<Integer,String> msm=new MyHashMep<>();
		msm.put(1, "123");
		msm.put(2, "hhh");
		msm.put(1, "432");
		msm.put(5, "gg");
		msm.put(21, "dd");
		System.out.println(msm);
		System.out.println(msm.get(21));
	}
}

由于HashSet底层使用HashMap实现的所以只需要创建一个HashMap。

/**
 * 有与HashSet底层就是靠HashMap实现所以只需要创建一个HashMap即可
 * 完成HashSet基本功能
 * @author yky
 *
 */
public class MyHashSet {
	HashMap hm;
	public static final Object PRESENT=new Object();
	public MyHashSet() {
		hm=new HashMap();
	}
	public void add(Object obj) {
		hm.put(obj, PRESENT);
	}
	public int size() {
		return hm.size();
	}
	public String toString() {
		StringBuilder sb=new StringBuilder();
		sb.append("[");
		for(Object key:hm.keySet()) {
			sb.append(key+",");
		}
		return sb.toString();
	}
	public static void main(String[] args) {
		MyHashSet hs=new MyHashSet();
		hs.add("123");
		hs.add("324");
		hs.add("432");
		System.out.println(hs);
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值