hashmap实现原理详解

来源:互联网 发布:js秒表倒计时 编辑:程序博客网 时间:2024/05/16 16:09

要毕业了,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<K,V> entry = getEntry(key);        return null == entry ? null : entry.getValue();    }
2.
 private V getForNullKey() {        if (size == 0) {            return null;        }        for (Entry<K,V> e = table[0]; e != null; e = e.next) {            if (e.key == null)                return e.value;        }        return null;    }
3.
final Entry<K,V> getEntry(Object key) {        if (size == 0) {            return null;        }        int hash = (key == null) ? 0 : hash(key);        for (Entry<K,V> 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<key,value>,还有一个next属性,指向下一个entry。
改天在写!!!!下班了



原创粉丝点击