程序员周末阿里面试,5分钟就被一道题秒杀:HashMap与Hashtable

大家可能会想,我这么菜的吗?5分钟都坚持不了?java

本文提及来会有点尴尬,毕竟这是我曾经经历过的故事

那时候的我还真菜,天天写着 if/ for 及一些简单的业务逻辑代码,虽工做有些日子了,但技术水平还停留在刚毕业的起步阶段。程序员

记得,那是一个周末,我去某知名互联网公司面试,好像不到五分钟,我就被面试官亲切地赶出来了,当时我那个尴尬,心里深受打击。面试

为何会被赶出来?这道题我记得很清楚,我不肯定是否是由于这道题,但倒是这道题结束了整个面试,大概的通过是这样:算法

面试官:HashMap 和 Hashtable 的区别是什么?数组

月亮:……(这个我答上来了,我整理了下,你们能够参考这篇文章:HashMap 和 Hashtable 的 6 个区别。)安全

面试官:那既然 Hashtable是线程安全的,又性能很差,那你还知作别的替代品吗?数据结构

月亮:……(没答上来)面试官:好吧,那咱们今天先聊到这里吧(起身送我走)……多线程

月亮:好的,谢谢。(尴尬离场)架构

尴尬后的感悟

如今想起来都以为尴尬。并发

如今竞争这么大,要求那么高,只会 Hashtable 的程序员真不能立足了,至少你得说得出 SynchronizedMap,虽然它的性能和 Hashtable 同样差,使用了全局对象锁来保证线程安全性,但至少你不仅是会 Hashtable。

其实上面的问题,最佳答案是:ConcurrentHashMap,说完这个,有很大几率面试官又会连番问它的实现原理,以及它在 JDK 各个版本中的不一样。

ConcurrentHashMap 是 JDK 1.5 添加的新集合,用来保证线程安全性,提高 Map 集合的并发效率。ConcurrentHashMap 使用了 Segment 的概念,默认有 16 个 Segment,Segment 里面依然仍是数组 + 链表的数据结构,至关于给 HashMap 分桶处理了。因每次只会锁住其中一个 Segment,因此性能很是好。

然而,有意思的是,随着 JDK 1.8 中对 HashMap 的改进,同时又对 ConcurrentHashMap 进行了改进,抛弃了 Segment + 数组 + 单向链表 的设计,改成了和 HashMap 一样的 数组 + 单向链表 + 红黑树 的数据结构。

同时,ConcurrentHashMap 使用了 CAS 算法 + Synchronized 来保证集合的线程安全性,ConcurrentHashMap 至关于一个性能安全的 HashMap。

ConcurrentHashMap 源码至关复杂,后面我会出一篇专门分析 HashMap 和 ConcurrentHashMap 源码和原理的文章,请你们关注个人博客,不要错过。

不过话又说回来,当初我面试 5 分钟就被送出来了,其实很正常,谁叫我当时只会Hashtable 呢!就像我如今面试人同样,若是中高级面试者只会 Hashtable 讲不出其余更多的,我也同样也会把他送出去,初级的还能够理解。

如今不少中高级程序员,虽然年限已经达到三年或者五年以上,但实际对多线程知识了解甚少,还停留在如何实现和使用多线程的水平。这种其实和初级程序员没什么区别,竞争力明显不足,因此怎么能要获得比初级程序员更高的价格呢?每天写业务代码,又如何成为大牛呢?

总结

因此,我给 Java 程序员的一些建议,特别是中高级程序员,必定要把 Java 核心技术学好,如多线程、集合的应用、数据结构、原理等,这是中高级面试必问的。

不要年纪上去了,对于底层知识殊不知道一二,否则随着年纪的不断增加,被淘汰的风险就越大,这样对于一个靠编码吃饭的程序来讲,真的很可怕!

若是你被我说中了,或许考虑换一个环境?

最近我会陆续分享一些我的的职场经验,踩坑经历,以及成长感悟,但愿能给一些职场新猿带来帮助。

我总结出了互联网公司java程序员面试涉及到的绝大部分面试题及答案作成了文档和架构视频资料免费分享给你们(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术资料),但愿能帮助到您面试前的复习且找到一个好的工做,也节省你们在网上搜索资料的时间来学习,也能够关注我一下之后会有更多干货分享。

领取面试资料方式:QQ群架构华山论剑:836442475【点击进入领取】(大牛汇集地)一块儿交流学习探讨!

相关文章
相关标签/搜索