1.hashmap的长度为什么是2的幂次方
1.数组下标的计算公式是: (N-1) & hash
2.要获取数组下标计算公式: hash%N 如果N(数组的长度)是2的幂次方 则等价于hash/N = (N-1) & hash
3.使用下标的计算公式&效率高
如果一个数是2的幂次方倍,则:
int isPow(n){
return (n & (n - 1)) == 0;//用来判断是否是2的幂次方
}
进行扩容时:
元素的位置要么是在原位置,要么是在原位置再移动2次幂的位置。对应的就是下方的resize的注释
jdk8:在扩容中只用判断原来的 hash 值与左移动的一位(newtable 的值)按位与操作是 0 或 1 就行,0 的话索引就不变,1 的话索引变成原索引加上扩容前数组
jdk1.7HashMap在多线程下会形成环形链表:
2sleep 和 wait 的区别
两者最主要的区别在于: sleep方法没有释放锁,而wait方法释放了锁。
两者都可以暂停线程的执行。wait通常被用于线程间交互/通信, sleep通常被用于暂停执行。
wait()方法被调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的notify()或者notifyA11()方法。
sleep()方法执行完成后,线程会自动苏醒。或者可以使用wait(longtimeout)超时后线程会自动苏醒。
网友评论