hashmap实现原理详解

要毕业了,hashmap是面试官非常喜欢问的问题,经常会碰到:来说说hashmap的实现原理,hashmap怎么get、put的,行吧,简单总结一下。

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; 初始大小,创建一个初始容量为16的数组,数组中的每个下标位置相当于一个链表,也就是一个桶;

static final float DEFAULT_LOAD_FACTOR = 0.75f;负载因子,当数组中的某个桶的元素个数超过12,就会对map数组进行扩容,变为原来的2倍,map中的数组元素需要重新hash;

int threshold;最大值为1<<31,每次对map数组进行扩容时,会看是否达到最大值,达到后,不会再扩容;

hashmap get :

1.

public V get(Object key) {
        if (key == null)
            return getForNullKey();
        Entry entry = getEntry(key);

        return null == entry ? null : entry.getValue();
    }
2.
 private V getForNullKey() {
        if (size == 0) {
            return null;
        }
        for (Entry e = table[0]; e != null; e = e.next) {
            if (e.key == null)
                return e.value;
        }
        return null;
    }
3.
final Entry getEntry(Object key) {
        if (size == 0) {
            return null;
        }

        int hash = (key == null) ? 0 : hash(key);
        for (Entry e = table[indexFor(hash, table.length)];
             e != null;
             e = e.next) {
            Object k;
            if (e.hash == hash &&
                ((k = e.key) == key || (key != null && key.equals(k))))
                return e;
        }
        return null;
    }

主要就3件事:

首先hashmap中可以有null,且唯一

1.当map.get(Object key)时,会判断key是否为空,如果为空,并且map中有一个key的值为null

进入getForNullKey()方法,然后开始遍历找到value返回,不然直接返回null。
2.如果key不为空,根据key的hash值去找到对应的hash存放位置(hash/(tableLength-1)),也就是对应的那个桶,里面可能会有很多数据;
3.开始遍历这个桶(链表),直到key相同时,返回value;

map中其实是一个数组,数组的每个位置有又是一个链表(相当于一个桶),桶里面存放数据是entry,,每个entry,还有一个next属性,指向下一个entry。

改天在写!!!!下班了



你可能感兴趣的:(hashmap实现原理详解)