手写HashMap

编写顶层接口

 

public interface Map<K,V> {

    public V put(K k,V v);

    public V get(K k);

    public int size();

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

}

 

 

实现类

import java.util.ArrayList;
import java.util.List;

public class HashMap<K, V> implements Map<K, V> {
    //扩容以后是不是需要把以前老表里面的元素再hash????  需要,index取模的位置发生变化
    //再hash耗时   所以此时map.put特别慢


    //初始容量    扩容机制  当前容量乘2      2^n
    private static int defaultLength = 16;
    //加载因子
    private static double defaultLoader = 0.75;

    private Entry<K, V>[] table = null;
    //初始大小
    private int size = 0;

    public static void main(String[] args) {
        HashMap<String, String> map = new HashMap<String, String>();

        for (int i = 0; i < 10000; i++) {

            map.put("huyue" + i, "huyue" + i);
        }

        for (int i = 0; i < 10000; i++) {

            String s = map.get("huyue" + i);
            System.out.println(i + "===" + s);
        }

    }


    public HashMap() {
        this(defaultLength, defaultLoader);
    }

    public HashMap(int length, double loader) {
        defaultLength = length;
        defaultLoader = loader;
        table = new Entry[defaultLength];
    }

    public HashMap(Entry[] table, int size) {
        super();
        this.table = table;
        this.size = size;
    }


    @Override
    public int hashCode() {
        return super.hashCode();
    }


    //递归获取链表中相等的值
    public V findValueByEqualKey(K k, Entry<K, V> entry) {

        if (k == entry.getKey() || k.equals(entry.getKey())) {

            return entry.getValue();
        } else {
            if (entry.next != null) {
                return findValueByEqualKey(k, entry.next);
            }

        }
        return null;
    }


    //获得存储位置
    public int getIndex(K k) {
        int m = defaultLength;
        //的到的可能是一个负数   jdk  决定的hashcode可能是一个负数   取反
        int index = k.hashCode() % m;
        return index >= 0 ? index : -index;
    }

    //存值
    private Entry<K, V> newEntry(K k, V v, Entry<K, V> next) {

        return new Entry(k, v, next);
    }

    //扩容
    public void up2Size() {
        Entry<K, V>[] newTable = new Entry[2 * defaultLength];
        //再hash
        reHash(newTable);
    }

    //再hash
    public void reHash(Entry<K, V>[] newTable) {
        List<Entry<K, V>> list = new ArrayList<Entry<K, V>>();
        //这里是把旧的表里面的数据找到,里面涉及到一个递归
        for (int i = 0; i < table.length; i++) {
            //当前数值位置没存值 跳过
            if (table[i] == null) {
                continue;
            }
            findEntryByNext(table[i], list);
        }
        if (list.size() > 0) {
            //再初始化
            size = 0;
            defaultLength = defaultLength * 2;
            table = newTable;
            //再hash
            for (Entry<K, V> entry : list) {
                if (entry.next != null) {
                    //重新hash,就是所有重新生成
                    entry.next = null;
                }
                //这里就是再hash
                put(entry.getKey(), entry.getValue());
            }
        }

    }


    //查询所有entry
    public void findEntryByNext(Entry<K, V> entry, List<Entry<K, V>> list) {
        //递归操作链表
        if (entry != null && entry.next != null) {
            list.add(entry);
            //递归下一个
            findEntryByNext(entry.next, list);
        } else {

            list.add(entry);
        }
    }


    //**************************************
    @Override
    public V put(K k, V v) {
        //根据k拿到存储位置
        int index = getIndex(k);
        //拿到当前值
        Entry<K, V> entry = table[index];
        //当前位置未被占用
        if (entry == null) {
            //next 第一个无指向
            table[index] = newEntry(k, v, entry);
            size++;
        } else {
            table[index] = newEntry(k, v, entry);
        }
        return table[index].getValue();
    }


    //**************************************
    @Override
    public V get(K k) {
        int index = getIndex(k);
        if (table[index] == null) {
            return null;
        }

        return findValueByEqualKey(k, table[index]);
    }

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


    //内部类
    class Entry<K, V> implements Map.Entry<K, V> {
        K k;
        V v;
        Entry<K, V> next;

        //构造函数
        public Entry(K k, V v, Entry<K, V> next) {
            this.k = k;
            this.v = v;
            this.next = next;
        }

        public K getK() {
            return k;
        }

        public void setK(K k) {
            this.k = k;
        }

        public V getV() {
            return v;
        }

        public void setV(V v) {
            this.v = v;
        }

        public Entry<K, V> getNext() {
            return next;
        }

        public void setNext(Entry<K, V> next) {
            this.next = next;
        }

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

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


}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值