Java手写简单HashMap一(包括增加,查找,toString,泛型)

@Java 300 学习总结

HashMap底层采用实现采用了哈希表,结合了“数组和链表”。
原理如图

一、定义HashMap类。

首先需要定义一个节点来存储数据,构成链表结构。

public class Node {
	int hash;
	Object key;
	Object value;
	Node next;
}
public class ggHashMap {
	Node[] table; //位桶数组,用于存放链表的第一个节点
	int size;
	public ggHashMap() {
		super();
		table = new Node[16]; //默认初始为16
	}

	public static void main(String[] args) {
		ggHashMap m1 = new ggHashMap();
		System.out.println();
	}
}

二、实现put方法,往HashMap里添加元素

每一个节点存放进HashMap里,首先根据key继续Hash值,以此确定插入的位置。


public int myHash(int v,int length) {
		return v&(length -1);//根据Hash值与位桶数组长度,进行位运算,保证插入元素的随机
									//位运算与取模运算效果相同,但是效率更高
	}
	
public void put(Object key, Object value) {
		Node newNode = new Node();
		newNode.hash = myHash(key.hashCode(),table.length); 
		//根据key的值取hash值,hashCode()为对象默认存在的方法
		newNode.key = key;
		newNode.value = value;
		newNode.next = null;
		
		Node temp = table[newNode.hash];//指向要插入的数组位置
		Node iterLast = null;//正在遍历的最后一个元素
		boolean keyRepeat = false;//判定元素key值是否相同被覆盖
		if(temp == null) { //数组元素为空
			table[newNode.hash] = newNode;
		}
		else { //不为空的情况
			while(temp!=null) { //遍历该链表
		
				//判断key是否重复
				if(temp.key.equals(key)) {
					keyRepeat = true;
					temp.value = value;
					break; //找到重复结束遍历
				}else {
					iterLast = temp; //iterLast跟着temp向后移一位
					temp = temp.next;
				}
			}
			if(!keyRepeat) {
				iterLast.next = newNode; //没有发现重复,最后一位的next,指向新节点
			}
		}
	}

三、实现toString方法

利用可以自动扩增的StringBuilder对象,遍历每个节点,可实现数据的HashMap的字符串。

public String toString() {
		StringBuilder sb = new StringBuilder("{");
		for(int i = 0;i < table.length;i++) {
			Node temp = table[i];
			while(temp!=null) {
				sb.append(temp.key+":"+temp.value + ",");
				temp = temp.next;
			}
		}
		sb.setCharAt(sb.length()-1, '}');//将最后一个,号,转为}
		return sb.toString();
	}

四、实现get方法,根据key获得value

根据key值计算hash数值,指针指向数组索引值和hash值相等的节点,遍历该节点的链表,找到key值相等的节点,返回value值

public Object get(Object key) {
		int hash = myHash(key.hashCode(), table.length);
		Object value = null;
		Node temp = table[hash];
		while(temp!=null) {
			if(temp.key.equals(key)) {
				value = temp.value;
				break;
			}else {
				temp = temp.next;
			}
		}
		return value;
	}

五、增加泛型

public class Node2<K,V> {
	int hash;
	K key;
	V value;
	Node2 next;
}
public class ggHashMap4<K,V> {
	public V get(K key) {

}
	public void put(K key, V value) {

}
	}
posted @ 2019-09-25 23:57  gg12138  阅读(1109)  评论(0编辑  收藏  举报