自己手动写一个HashMap

数据结果与算法绪论

Map接口

public interface Map<K,V> {
    V put(K k, V v);
    V get(K k);
    int size();

    interface Entry<K,V>{
        K getKey();
        V getValue();
    }
}

HashMap实现类

public class HashMap<K,V> implements Map<K,V> {

    private Entry<K,V> table[] = null;
    int size = 0;
    public HashMap(){
        table = new Entry[16];
    }

    /**
     * 通过key 进行hash
     * index下表数组 当前数组对应的对象Entry
     * 判断当前这个对象为空 如果是空的,直接可以存储数据,如果不为空,就是hash冲突,所以要用链表,然后返回这个存储结果
     * @param k
     * @param v
     * @return
     */
    @Override
    public V put(K k, V v) {
        int index = hash(k);
        Entry<K,V> entry = table[index];
        if(entry == null){
            table[index] = new Entry<>(k,v,index,null);
            size ++ ;
        }else{
            table[index] = new Entry<>(k,v,index,entry);
        }
        return (V)table[index].getValue();
    }

    private int hash(K k) {
        int i = k.hashCode() % 16;
        return i>=0?i:-i;
    }


    /**
     * 通过key进行hash
     * 找到数组的下标index
     * 找到Entry对象 是否为空
     * 如果为空 直接返回 没有找到
     * 如果不为空 然后判断k和当前对象的key是否相等
     * 如果不相等 不是它 然后在判断next是否为空
     * 如果不为空 在进行比较key值 直到相等 才返回 或者返回null
     * @param k
     * @return
     */
    @Override
    public V get(K k) {
        if(size==0){
            return null;
        }
        int index = hash(k);
        Entry<K,V> entry = findValue(table[index],k);
        return entry == null?null : (V)entry.getValue();
    }

    private Entry<K,V> findValue(Entry<K,V> kvEntry, K k) {
        if(k.equals(kvEntry.getKey())||k == kvEntry.getKey()){
            return kvEntry;
        }else{
            if(kvEntry.next!=null){
                return findValue(kvEntry.next,k);
            }
        }
        return null;
    }

    @Override
    public int size() {
        return size;
    }

    class Entry<K,V> implements Map.Entry<K,V>{
        K k;
        V v;
        int hash;
        Entry<K,V> next;

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

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

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

测试

public class Test {
    public static void main(String[] args) {
        Map<String,String> map = new HashMap<>();
        map.put("test","test222");
        System.out.println("test的value值为:" + map.get("test"));
    }
}

posted @ 2022-03-17 18:06  你樊不樊  阅读(58)  评论(0编辑  收藏  举报