手写hashMap

package com.boot.test;

/**
 * @param <K>
 * @param <V>
 */
public interface YmmMapService<K, V> {
    /**
     * put value to arrays index key
     * @param k key
     * @param v value
     * @return V value
     */
    V put(K k, V v);

    /**
     * get value to arrays by index key
     * @param k key
     * @return V value
     */
    V get(K k);

    /**
     * get hashCode by index key
     * @param k key
     * @return V value
     */
    int ymmHashCode(K k);

}

  上面是service;

  下面是impl;

package com.boot.test;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class YmmMap<K,V> implements YmmMapService {

    private final static Logger logger = LoggerFactory.getLogger(YmmMap.class);

    /** 默认初始化16个Entry*/
    int size = 16;

    private YmmMap.Entry[] arrays;

    public YmmMap(int size){
        arrays = new YmmMap.Entry[size];
    }

    public YmmMap(){
        arrays = new YmmMap.Entry[size];
    }


    @Override
    public Object put(Object key, Object value) {
        /* 先计算key的hashCode,然后将key,value放入hashCode对应的entry里,如果hash冲突, 则将    
           原来的entry放到链表后面,把对应的指针给新的entry*/
        int hashCode = ymmHashCode(key);
        int index = hashCode;
        boolean exist = arrays[hashCode] == null;
        //数组里该节点为空,则放入该位置
        if (exist){
            arrays[index] = new Entry(key,value,null);
        }else {//否则将原来的entry放到链表后面,把对应的指针给新的entry
            Entry<Object, Object> oldEntry = arrays[index];
            arrays[index] = new Entry(key, value, oldEntry);
        }
        return value;
    }

    @Override
    public Object get(Object key) {
        int ymmHashCode = ymmHashCode(key);
        /* 如果该下标数组无值,则返回null,否则比较key是否相同,相同返回value,不同找next,
        继续比较是否相同,若无next节点,且key不同,则返回null*/
        Entry entry = arrays[ymmHashCode];
        if (entry == null){
            return null;
        }else {
            entry = getNextEntryValue(entry, key);
            if (entry == null){
                return null;
            }
        }
        return entry.v;
    }

    Entry getNextEntryValue(Entry entry, Object key){
        if (key.equals(entry.getKey())){
            return entry;
        }else {
            Entry next = entry.getNext();
            if (next == null){
                return null;
            }else {
                return getNextEntryValue(next, key);
            }
        }
    }

    @Override
    public int ymmHashCode(Object key) {
        int hashCode = key.hashCode();
        int hash = hashCode % size;
        logger.info("key:{},hashCode:{}, YmmHashCode:{}",key, hashCode, hash);
        return hash;
    }

    private class Entry<K,V>{
        K k;
        V v;
        Entry next;
        int hashCode;

        public Entry(K k, V v, Entry next){
            this.k = k;
            this.v = v;
            this.next = next;
            hashCode = getHashCode(k);
        }

        private int getHashCode(K k){
            return k.hashCode();
        };

        @Override
        public K getKey() {
            return this.k;
        }

        @Override
        public V getValue() {
            return this.v;
        }

        @Override
        public Entry getNext() {
            return this.next;
        }


    }
}

-----------------------------------------------第一版,耗时28分钟----------------------------------------------

问题1、实现类不能用泛型做参数,报错have same erasure,balabala.....明天看看源码怎么实现的

问题2、只实现了数组加链表,链表又不是物理上的链表,要学习下链表底层原理,红黑树也并未用到,下周看看源码怎么实现的。

接下来的一周晚上继续改造,增加非空校验,泛型处理,以及hashMap底层实现原理。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值