面试系列之HashMap

266 阅读1分钟

1.默认初始大小是16

1)为什么是2的幂次方

因为计算元素在桶中的位置是tab[i = (n - 1) & hash],n表示HashMap的大小,hash表示key的hashcode (n - 1) & hash === hash %n,使用位运算代替了取模运算。之所以可以做等价代替,前提是要求HashMap的容量一定要是2^n

2)为什么初始化是16

关于这个默认容量的选择,JDK并没有给出官方解释

3) 不管容量传几,最后HashMap都会计算得到一个离的传入数最近的2的幂次方的一个数作为容量大小

static final int tableSizeFor(int cap) { int n = cap - 1; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16; return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1; }

2.扩容?

HashMap有扩容机制,就是当达到扩容条件时会进行扩容。HashMap的扩容条件就是当HashMap中的元素个数(size)超过临界值(threshold)时就会自动扩容。 在HashMap中,threshold = loadFactor * capacity。 loadFactor是装载因子,表示HashMap满的程度,默认值为0.75f,设置成0.75有一个好处,那就是0.75正好是3/4,而capacity又是2的幂。所以,两个数的乘积都是整数。
欢迎在评论补充HashMap相关的面试问题

3.为什么table是transient

防止序列化的的时候写入空桶,自己重写了writeObject,写入序列化的数据