手写HashMap

import java.util.Objects;//Objects类的equals方法是判断两个对象是否相等。
                        //在比较两个对象的时候,Object.equals方法容易抛出空指针异常。
public class MyHashMap<K, V> {

    private class Entry<K, V>{      //将Entry定义为成员内部类,里面封装了Entry自己的put和get方法
        private K key;
        private V value;
        private long hash;

        private Entry<K, V> next;   //用next实现链表
        private Entry(K key, V value){
            this.key = key;
            this.value = value;
            this.hash = this.key.hashCode();
        }
        private void put(Entry<K, V> entry){
            if(this.hash == entry.hash && Objects.equals(this.key, entry.key)){
                this.value = entry.value;   //覆盖
            }
            else{
                if(Objects.isNull(this.next)){
                    this.next = entry;
                    size ++;        //这里不能用this.size;  this.size表示这个类的size,这里是内部类,直接使用外部的size
                }else{
                    this.next.put(entry);   //递归
                }
            }
        }

        private Entry<K, V> get(K key){
            if(Objects.equals(key, this.key))
                return this;
            if(Objects.isNull(this.next))
                return null;
            return this.next.get(key);  //递归
        }
    }

    private int size;
    private Entry[] entries;
    private static final int DEFAULT_LENGTH = 4;

    public MyHashMap(int entryLength){      //MyHashMap构造函数
        this.entries = new Entry[entryLength];
    }
    public MyHashMap(){       //MyHashMap<Integer, Integer> map = new MyHashMap<>();
        this(DEFAULT_LENGTH); //如上不指明哈希表的长度的时候,调用这个构造函数
    }
    public int size(){
        return this.size;
    }
    private int hash(K key){    //计算entries数组的下标
        return key.hashCode() % entries.length;
    }

    /**
     * MyHashMap自己的put,get方法,实际上利用内部类Entry的put,get方法
     * @param key
     * @param value
     */
    public void put(K key, V value){
        Entry<K, V> entry = new Entry<>(key, value);
        int index = this.hash(key);
        if(Objects.isNull(entries[index])){
            entries[index] = entry;
            size ++;
        }
        else{
            entries[index].put(entry);
        }
    }

    public V get(K key){
        int index = this.hash(key);
        if(Objects.isNull(entries[index]))
            return null;
        Entry<K, V> entry = this.entries[index].get(key);
        return entry == null ? null : entry.value;
    }

    public boolean isEmpty(){
        return this.size > 0;
    }

    //for test
    public static void main(String[] args) {
        MyHashMap<Integer, Integer> map = new MyHashMap<>();
        map.put(1,1);
        map.put(2,2);
        map.put(3,3);
        System.out.println(map.get(1));
        System.out.println(map.size());
    }
}
全部评论

相关推荐

个人背景:学院二本计科专业&nbsp;大二开始实习个人经历:安克创新&nbsp;、理想汽车、字节跳动碎碎念:我做事只有三分钟热度。看到进了大厂的同学,我会羡慕,也会跟着努力上进;但遇到好看的小说,我又会放下手头的事沉迷其中,之前的坚持也就中断了。我有些自卑,总觉得自己学历和外貌都不够好。之前偶然在网上受到关注,我就喜欢上了上网,因为这里有很多人认可我。但我也很在意别人的评价,偶尔看到嘲讽的言论,会触发我的自卑情绪,让我感到愤怒。有时候我会强硬地回怼,有时候又会懦弱地选择无视。我也有虚荣心。不管是拿到安克、理想还是字节的机会,我在分享的时候都会带着这份心思。我会特意强调自己学历不好,是为了衬托出过程的艰难,以此显得自己更厉害。我知道,人往往会炫耀自己缺少的东西,来掩盖内心的空洞。我总想着走捷径,不太喜欢踏踏实实地做事。找实习的时候,我花了更多时间在研究面试技巧上,而不是提升专业能力。我会反复听面试录音分析技巧,看面试教程学习怎么和不同的面试官沟通,还会每天自言自语练习语言表达,同学都觉得我有点奇怪。我的实习生涯里,侥幸和运气占了很大一部分。我总在想,如果有一天我失去了这份幸运,这些特质可能会让我一蹶不振。ps:&nbsp;很多人会问我学习路线和经验&nbsp;但是就像我上面说的&nbsp;我的实习过程靠的很多是关键节点的运气&nbsp;技术上面我可能不如很多人&nbsp;&nbsp;所以请大家理性求助和理性参考我的回答&nbsp;附上我的投递记录
我的offer在哪里...:从去年看到现在,飞升哥就是榜样
我的求职进度条
点赞 评论 收藏
分享
评论
点赞
7
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务