手动实现HashMap

来源:互联网 发布:我的淘宝 编辑:程序博客网 时间:2024/06/01 07:24
public class HashMap {


    private static final int DEFAULT_INITIAL_CAPACITY = 16;
    private static final float DEFAULT_LOAD_FACTOR = 0.75f;
    private int threshold;
    private int size;
    private int resize;


    private HashEntry[] table;


    public MyHashMap() {
        table = new HashEntry[DEFAULT_INITIAL_CAPACITY];
        threshold = (int) (DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR);
        size = 0;
    }


    private int index(Object key) {
        return key.hashCode() % table.length;
    }


    public void put(Object key, Object value) {
        if (key == null) return;
        int index = index(key);


        HashEntry entry = table[index];
        while (entry != null) {
            if (entry.getKey().hashCode() == key.hashCode() && (entry.getKey() == key || entry.getKey().equals(key))) {
                entry.setValue(value);
                return;
            }
            entry = entry.getNext();
        }
        add(index, key, value);
    }


    private void add(int index, Object key, Object value) {
        HashEntry entry = new HashEntry(key, value, table[index]);
        table[index] = entry;
        if (size++ >= threshold) {
            resize(table.length * 2);
        }
    }


    private void resize(int capacity) {
        if (capacity <= table.length) return;


        HashEntry[] newTable = new HashEntry[capacity];
        for (int i = 0; i < table.length; i++) {
            HashEntry old = table[i];
            while (old != null) {
                HashEntry next = old.getNext();
                int index = index(old.getKey());
                old.setNext(newTable[index]);
                newTable[index] = old;
                old = next;
            }
        }
        table = newTable;
        threshold = (int) (table.length * DEFAULT_LOAD_FACTOR);
        resize++;
    }


    public Object get(Object key) {
        if (key == null) return null;
        HashEntry entry = getEntry(key);
        return entry == null ? null : entry.getValue();
    }


    public HashEntry getEntry(Object key) {
        HashEntry entry = table[index(key)];
        while (entry != null) {
            if (entry.getKey().hashCode() == key.hashCode() && (entry.getKey() == key || entry.getKey().equals(key))) {
                return entry;
            }
            entry = entry.getNext();
        }
        return null;
    }


    public void remove(Object key) {
        if (key == null) return;
        int index = index(key);
        HashEntry pre = null;
        HashEntry entry = table[index];
        while (entry != null) {
            if (entry.getKey().hashCode() == key.hashCode() && (entry.getKey() == key || entry.getKey().equals(key))) {
                if (pre == null) table[index] = entry.getNext();
                else pre.setNext(entry.getNext());
                size--;
                return;
            }
            pre = entry;
            entry = entry.getNext();
        }
    }


    public boolean containsKey(Object key) {
        if (key == null) return false;
        return getEntry(key) != null;
    }


    public int size() {
        return this.size;
    }


    public void clear() {
        for (int i = 0; i < table.length; i++) {
            table[i] = null;
        }
        this.size = 0;
    }




    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(String.format("size:%s capacity:%s resize:%s\n\n", size, table.length, resize));
        for (HashEntry entry : table) {
            while (entry != null) {
                sb.append(entry.getKey() + ":" + entry.getValue() + "\n");
                entry = entry.getNext();
            }
        }
        return sb.toString();
    }
}
原创粉丝点击