Java面试最容易被问到的就是HashMap,因为HashMap源码确实很值得学习,里面的数据结构算法设计很巧妙,搞懂整个过程在面试中可以大大加分,一个HashMap也可以扯半个小时。
首先HashMap是线程不安全的,在源代码中没有任何加锁操作,因此效率非常高,但是仅仅适用于单线程中,多线程操作就需要考虑HashTable和currentHashMap,这两个又有什么区别呢,两个都是加锁的,但是currentHashMap效率比HashTable高。
因为currentHashMap加锁的粒度更细,对代码段加锁,只对当前桶加锁,其他线程如果需要访问或修改当前桶则需要等待,但是其他线程访问或修改其他桶中的数据时,线程是不需要阻塞的。
HashTable加锁粒度是方法级,给方法加锁本质上还是给对象加锁,Java中如果给方法A、B都加锁,那么Thread1调用方法A时,Thread2也不能调用方法B,需要等Thread1释放锁后才能调用。HashTable中给方法加锁导致的后果就是Thread1调用HashTable中任何一个方法时,Thread2都需要等待。
这里有一个对HashMapjiao讲解的非常详细的文章,里面的Hash算法可以好好看一下。
hashmap详解
为什么每次扩容都是2倍,主要原因还是在hash算法和resize时方便而设计的。这些都在文章中详细讲解了。
本人在腾讯、美团、顺丰科技、字节跳动等大厂的面试中都被问到这个问题。
下面是其他一些面试中经常被问到的问题:
· 虚拟机垃圾回收(腾讯)
· CMS、G1垃圾回收(美团)
· 已知ping 时间为100ms,那么在浏览器中发起一个请求的时间是多少?(腾讯)
· 100万个数里找出最大的100个数(顺丰,堆排序)
· 进程间通信(腾讯,需要深入理解)
· 一个数组中只有一个数重复,找出重复的数,数组无须,不是连续的(腾讯,bitmap)