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); }