自己写一个HashMap

2 篇文章 0 订阅
1 篇文章 0 订阅

前言 (Foreword)

最近操作系统实验感觉一直在copy,copy。。。嗯,不是感觉。连个HashMap自己都懒得写。许久之前看过【码农翻身】的《什么是HashMap》,推荐一下这个公众号(码农翻身),炒鸡棒!看过这篇推送后一直没有实现。今天终于可以拿起笔来写一写。写的有什么不对的请指出,勿喷。

原理 (Theory)

HashMap是一种以键值对存储数据的数据结构,简单的来说是这样。内部怎么实现的呢?实际上使用一个数组(entries),然后数组中的每一个元素可以看成是一个链表(entry)。当存储一个键值对时,你拿着一个Key和Value,哈希算法会根据你的Key来计算出一个值,我们把这个值当作内部数组(entries)的索引值(index),然后找这个索引值下的元素来存储value值,如果此索引下已经存在元素,但因为每个数组元素(entry)可以看作是链表可以连着存储,故可以插入该索引。只不过这里是头插法,因为某种不可抗力会更有可能查询刚插入的元素。先看一下代码,虽然写的很糟,如果实在不能理解,请看一下【码农翻身】上面给了链接。

代码(Code)

这是源代码
public class MyHashMap<K,V> {

    private static int default_length=16;
    private MyEntry<K, V>[] entries;


    public MyHashMap() {
        super();
        entries = new MyEntry[default_length];
    }

    public V put(K key,V value) {
        int index = key.hashCode()%default_length;
        MyEntry<K, V> previous = entries[index];
        for(MyEntry entry=entries[index];entry!=null;entry = entry.next) {
            if(entry.getKey().equals(key)) {
                V oldValue = (V) entry.getValue();
                entry.setValue(value);
                return oldValue;
            }
        }
        MyEntry<K, V> entry = new MyEntry<>(key,value);
        entry.next=previous;
        entries[index] = entry;
        return null;
    }

    public V get(K key) {
        int index = key.hashCode()%default_length;
        for(MyEntry<K, V> entry=entries[index];entry!=null;entry=entry.next) {
            if(entry.getKey().equals(key)) {
                return entry.getValue();
            }
        }
        return null;
    }


    private final class MyEntry<K,V> {
        private K key;
        private V value;
        private MyEntry next;
        public MyEntry(K key, V value) {
            super();
            this.key = key;
            this.value = value;
        }
        public MyEntry() {
            super();
        }
        public MyEntry(K key, V value, MyEntry next) {
            super();
            this.key = key;
            this.value = value;
            this.next = next;
        }
        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 MyEntry getNext() {
            return next;
        }
        public void setNext(MyEntry next) {
            this.next = next;
        }
    }
}
这是测试代码
public class HashTest {

    public static void main(String[] args) {
        MyHashMap<String, Integer> mhm = new MyHashMap<>();
        mhm.put("lmy", 20);
        System.out.println(mhm.get("lmy"));
    }
}
这是结果

这里写图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值