@HashMap基础

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方法正确。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值