Q: HashMap的底层原理
A: HashMap底层用的是拉链法. Hash表为链表的数组. 先计算Hash值, 在数组里找到对应的链表, 检查值存不存在, 如果不存在, 在链表里追加。
Q: HashMap的Hash函数是怎么样的?
A: 对象的hasCode(), 然后进行一定扰动, 让其分布均匀。所以 HashMap 的 Key 一定是要可以被哈希的,int 等 原始类型不能作为 Key.
Q: HashMap如何Reszie?
A: 默认的负载因子为0.75. 扩为原来的2倍, 然后重新整理对象.
Q: 为什么HashMap是线程不安全的
A: 有可能多个线程同时对HashMap对象发起resize
Q: ConcurrentHashMap是如何实现线程安全的.
A: 加锁。JDK 1.7 将数据分段,对每一段数据分配一把锁。当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。1.8 版本舍弃了 segment,并且使用了大量的 synchronized,以及 CAS 无锁操作以保证 ConcurrentHashMap 的线程安全性。