hashmap时间复杂度

理想情况下HashMap的时间复杂度为O(1),因为对于内存来说,访问任何地址的时间是一样的,即时间极短,相当于可以同时访问到所有地址。

而在时间复杂度为O(1)时,需要很大的内存空间,所以必须要对内存和时间进行取舍。

咋取舍呢,hashmap在初始化的时候有俩值,初始大小和负载因子,默认是16和0.75

大小不用解释,负载因子就是一个小数,扩容的时候用的,在put的时候,hashmap就检查一下自己的大小,是不是大于16x0.75(大小x负载因子),如果是,就扩容,扩容到2^n,为啥是这个呢,我看了很多资料,

hash值要进行取余运算,而数学证明,hash%(2^n)=hash^(2^n-1),为了效率,就采用了2倍的扩容。ps:^为异或,2^n为2的n次方

面试题:初始构造器设置大小为25,hashmap实际大小是多少?

实际是64,首先,找到比25大的2^n,是32,负载因子为0.75,则能装24个,25>24,触发扩容,为64.

下面是hash运算的源码

static final int hash(Object key) {
    int h;
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
posted @ 2017-11-22 13:22  Aiopr  阅读(5949)  评论(0编辑  收藏  举报