这篇文章结合自身的工作经验,站在面试官和面试者的不同角度上来说明两种现象:
- 为山九刃,功亏一篑:差之毫厘的遗憾
- 云销雨霁,彩彻区明:柳暗花明的兴奋
有些问题回答上来不加分,But没有答上来or回答错误,Good bye…
也有些问题答不出来或者答错没有任何影响,但是答出来让面试官刮目相看…
送面试官一句话:
凡是不愿意看不到别人长处的人,总是一眼就看到别人不如自己之处。
送面试者一句话:
生命中最难的阶段不是没有人懂你,而是你不懂你自己。
1. 时空互换
在学习数据结构的时候,我们都会讨论 时间复杂度 和 空间复杂度。纵观所有算法,无不围绕着时间和空间去优化,无不在这两方面进行权衡妥协。
面试过程中,若遇到算法题并尝试对其进行优化时,可以从这方面入手。一般情况下,我们都是牺牲空间来赢得时间。但在嵌入式编程或者存储空间有限的情况下,则会适当的牺牲时间来换取空间上的优化。
比如:递归优化(斐波那契数列… 爬楼梯问题…)
2. 面试中关于为什么这样的设计的问题?
Whatever is reasonable is true,and whatever is true is reasonable. 存在即合理
这种问题主要从效率 和 安全 两个方面去阐述:
- String 为什么要设计成不可变的?
- String 为什么要重写hashCode()?
- 为什么要设计线程池?
- …
3.(线程)安全与速度的抉择?
鱼和熊掌二者不可得兼。
目前这类问题在面试环节主要体现在以下两个方面:
- StringBuilder 和 StringBuffer 的选择.
- HashMap 和 HashTable 的选择.
IOW,在不涉及线程安全问题,线程安全 在速度上要稍逊于 非线程安全的。 (PS:可以类比 多经过一道防盗门 去理解)
4. 运算优化
我们在阅读源码的过程中,会发现其中有很多的移位操作。这里强调一点,可以 将乘除优化为左右移位操作。(PS:随着JVM越来越智能,已经帮我们自动处理啦)
5. 底层实现的特性
实现方式 | 特点 |
---|---|
数组实现 | 查询速度快,插入,删除效率低 |
链表实现 | 查询速度慢,插入,删除效率高 |
树实现 | 扬长避短 |
Java 一般涉及的都是ArrayList,LinkedList…etc
这种基本问题若回答错误,绝对是Bye…柳暗花明的可能性也不复存在…
6. 关于数字问题
对于阅读过源码且有心的人来说,很容易发现Java在数字选择上有一点的规律:
- 质数(7,11,31)
- 有利于运算优化的数(7 = 2<< 3 -1, 31 = 2<<5 -1 )
- 2的N次方( 2^ N = 2 << N)
常见场景:
- 线程池有几个参数? 7
- Object类有几个方法? 7
- String的hashCode()如何实现?记住31即可
- HashTable的初始容量? 11
- HashMap的初始容量? 2 << 4 -1 = 16
- HashMap的链表进行树化的阈值? 8 = 2^3
…
总结
面试是双向选择的过程。有时候面试下来自我感觉良好,唯独少了一份OFFER…可以参考以上内容,是不是犯了"不可饶恕"的错误。
郑重声明:
就算不知道上面的内容,也是可以找到一份工作的…