java实现HashMap

本文提供了一个简易版HashMap的实现,通过自定义MyNode类模拟链表结构,并结合数组构成HashMap的基本框架。介绍了如何进行元素的放置与获取,适用于初学者理解HashMap的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

闲着没事自己随便写了一个类似hashMap得简单功能代码,技术有限,仅供参考

对于真正hashMap中用到的,树形结构以及jdk1.8中的红黑树,下面内容未涉及(只是简单得实现)

hashMap是由数组和链表组成得:

首先对于类似链表数据得封装类:MyNode<K,V>

/**
 * 模拟链表,每个节点上存放key值,value值,以及下个节点的信息
 * @author admin
 *
 * @param <K>
 * @param <V>
 */
public class MyNode<K,V> {
    private int hash;
    private K key;
    private V value;
    //下一个节点元素
    private MyNode<K,V> next;
    public int getHash() {
        return hash;
    }
    public void setHash(int hash) {
        this.hash = hash;
    }
    public K getKey() {
        return key;
    }
    public void setKey(K key) {
        this.key = key;
    }
    public V getValue() {
        return value;
    }
    public void setValue(V value) {
        this.value = value;
    }
    public MyNode<K, V> getNext() {
        return next;
    }
    public void setNext(MyNode<K, V> next) {
        this.next = next;
    }

}

对于数组:MyHashMap<K,V>,这里需要计算,放置得元素所在,数组得位置

public class MyHashMap<K,V> {
    private  MyNode<K,V>[] node;
    public MyHashMap(){
        //默认初始化大小16,没有写扩容
        node=(MyNode<K, V>[])new MyNode[16];
    }
    //放置元素
    public  void put(K key,V value){
        //计算放置元素得数组下标
        int hash = hash(key);
        MyNode<K, V> myNode = node[hash];
        MyNode<K,V> nextNode=new MyNode<K,V>();
        //当前下标下是否有元素
        if(myNode!=null){
        nextNode=myNode;
        MyNode<K,V> nextNodeBak=myNode;
        boolean flag=true;
        while(nextNode!=null){
            //如果key值存在,覆盖
            if(nextNode.getKey().equals(key)){
                    nextNode.setValue(value);
                    flag=false;
                    break;
            }
            nextNodeBak=nextNode;
            nextNode=nextNode.getNext();
        }
        if(flag){
                nextNode=new MyNode<K,V>();
                nextNode.setHash(hash);
                nextNode.setKey(key);
                nextNode.setValue(value);
                nextNodeBak.setNext(nextNode);
        }else{
                //当前下标没有元素直接放置
                nextNode.setHash(hash);
                nextNode.setKey(key);
                nextNode.setValue(value);
                node[hash]=nextNode;
        }
    }
    //取元素
    public V get(Object key){
        int hash = hash(key);
        MyNode<K, V> myNode = node[hash];
        MyNode<K,V> nextNode=myNode;
        while(nextNode!=null){
            if(nextNode.getKey().equals(key)){
                return nextNode.getValue();
            }else{
                nextNode=nextNode.getNext();
        }
    }
        return null;
    }

    private  int hash(Object key){
        int h;
        int hash=(key == null) ? 0 : (key.hashCode()%16);
        return Math.abs(hash); //防止负数 
    }
}

能力有限,不喜勿喷,欢迎交流。

一只行走的小笨猿。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值