尝试手写HashMap

package day01;


import java.security.Key;

/**
 * @version 1.0
 * @ClassName Test01
 * @category javaSE
 * @QQ 1826286736
 * @Author ${每特教育JY-010-小萌新}
 * @Date 2022年01月29日 16:33
 **/
public class HashMap01<k, v> {
    /**
     * 定义一个Object数组
     * 假设Object数组基础容量为1000
     */
    private Entry[] entrys = new Entry[1000];

    /**
     * 1 创建一个容器Entry存放键值对
     */
    class Entry<K, V> {
        // key
        K k;
        // Value
        V v;

        // hash值
        int hash;

        // 链表
        Entry<K, V> next;

        public Entry(K k, V v, int hash) {
            this.k = k;
            this.v = v;
            this.hash = hash;
        }
    }

    public void put(k K, v v) {
/**
 * 1 根据key的hashcode值取余entrys.length
 * 得到的值就是该key存放在entrys数组中的index位置
 * 1.先判断该位置是否存有链表
 * 2.如果能够取出该entry对象,则该位置已经存放,就会形成一个链表
 * 如果没有取出来,则该位置为空,可以直接存放
 */
        int hash = K.hashCode();
        int index = hash % entrys.length;
        Entry entry = entrys[index];
        if (entry == null) {
            entrys[index] = new Entry<>(K, v, hash);
        } else {
            entry.next = new Entry<>(K, v, hash);
        }

    }

    public v get(k K) {
        /**
         * 根据key获取到Value值
         * 因为key的值是相同的,hashcode也是相同的,所以再取entrys.length的余数也是相同的
         * 最终index值也是和put方法的index值一样
         */
        int hash = K.hashCode();
        int index = K.hashCode() % entrys.length;
        for (Entry<k, v> entry = entrys[index]; entry != null; entry = entry.next)
            if (entry.hash == hash && (entry.k == K || entry.k.equals(K))) {
                return entry.v;
            }
        return null;
    }

    public static void main(String[] args) {
        HashMap01<Object, Object> hshMap01 = new HashMap01<>();
        hshMap01.put("a", "mete");
        hshMap01.put(97, "mete666");

        System.out.println("根据key获取到的Value值:" + hshMap01.get("a"));
        System.out.println("根据key获取到的Value值:" + hshMap01.get(97));
    }
    /**
     * hashcode值相同但是值不相同就会发生hash冲突问题
     * 例如key="a"和key=97 计算的hashcode值相同 ,最终的index也相同
     *如果在HashMap集合中发生Hash冲突问题是使用链表数据结构来解决(存放)的
     */
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个手写HashMap的C++代码示例: ```cpp #include <iostream> #include <vector> using namespace std; class HashMap { private: vector<pair<int, int>> buckets; int size; public: HashMap() { size = 10000; buckets.resize(size); } void insert(int key, int value) { int index = key % size; buckets[index = make_pair(key, value); } int find(int key) { int index = key % size; if (buckets[index].first == key) { return buckets[index].second; } return 0; } }; int main() { HashMap map; map.insert(1, 1); map.insert(2, 2); map.insert(3, 3); map.insert(4, 4); cout << map.find(1) << endl; cout << map.find(2) << endl; cout << map.find(3) << endl; cout << map.find(4) << endl; return 0; } ``` 这个HashMap类使用除留余数法来处理冲突。它具有插入和查找功能。在插入时,将关键字和值存储在散列表的对应位置。在查找时,根据关键字找到对应的位置,并返回对应的值。如果没有找到对应的关键字,则返回0。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [手写HashMap](https://blog.csdn.net/weixin_45750972/article/details/121058487)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [C++ 手写简单哈希散列表](https://blog.csdn.net/weixin_44178960/article/details/125766207)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值