1.HashMay简介
当我们需要存储键值对,可以通过键值找到key值,这就需要用到Hash表这种高效的数据结构了。Hash表结合了数组和链表的优点,便于查找和增加删除。
2.HashMap实现
1.首先Hash表底层存储结构是数组,数组中元素存储链表,我们可以定义链表中节点的数据结构,节点属性有key,value,和指向下一节点的指针。代码如下
package comzq1024;
/**
* this()调用构造方法
* 不可以有重复的Value
* 存null值
* 限制存的类型(泛型)
*
*/
public class Node {
//hash表数组元素中存节点
Object key;
Object value;
Node next;
public Node(Object key, Object value) {
this.key = key;
this.value = value;
}
//自定义构造方法要写出默认空构造方法,防止出错
public Node(){}
//检测元素个数
}
2.在节点的基础上,我们可以定义链表。链表的属性有头节点,尾结点和链表的长度。链表具有尾结点可以方便节点的插入。链表具有插入和查找的方法,代码如下:
package comzq1024;
public class LinkedList {
//链表属性有链表长度,头结点,尾结点
Node head;
Node tail;
private int size;
public LinkedList() {
Node newNode = new Node();
head = newNode;
tail = newNode;
size++;
}
//链表有添加节点的方法
public void addNode(Object key, Object value){
Node newNode = new Node(key, value);
//如果头结点为空,头结点为新节点
if(head.equals(null)){
head = newNode;
tail = newNode;
}else{
//如果头结点不为空,创建一个节点放在尾结点后
tail.next = newNode;
tail = tail.next;
}
}
//查找元素的方法,根据key值查找value值
public Object search(Object key){
Node searchNode = head;
while (searchNode != null){
if(searchNode.key == key){
return searchNode.value;
}
searchNode = searchNode.next;
}
return null;
}
}
3.定义了链表后,我们就可以设计HashMap了。Hashmap底层存储结构为数组,需要设计Hash函数,这里我们提供了put和get方法,代码如下:
package comzq1024;
import java.util.ArrayList;
import java.util.List;
public class Hashmap {
//Hashmap属性有底层存储数组的长度,hash表的大小
LinkedList[] array; //数组中元素存链表
private final int length = 16;
public int size;
public Hashmap(){
array = new LinkedList[length];
for(int i=0; i<array.length; i++){
array[i] = new LinkedList();
}
}
//Hashmap需要hash函数
public int hashfunction(Object key){
int hashkey = key.hashCode() % length;
return hashkey;
}
//put函数,通过key值计算出hashkey值
public void put(Object key, Object value){
int hashkey = hashfunction(key);
//将key值,value值存入数组
array[hashkey].addNode(key,value);
//hash表大小+1
size++;
}
//get函数,传入key值,获取其value值
public Object get(Object key){
int hashkey = hashfunction(key);
Object value = array[hashkey].search(key);
return value;
}
}
4.这样,我们就设计出了一个简易版的HashMap了,接下来我们来验证一下
package comzq1024;
public class Test {
public static void main(String[] args) {
Hashmap hashmap = new Hashmap();
hashmap.put("张三", "24");
hashmap.put("李四", "23");
hashmap.put("王五","22");
System.out.println(hashmap.size);
Object value = hashmap.get("李四");
System.out.println(value);
}
}
结果如下,可知HashMap的put和get方法正确。