用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);
	}
}

猜你喜欢

转载自blog.csdn.net/Kyrie6c/article/details/107179658