最近面试了不少候选人,发现不少人都不过重视基础,甚至连工做十几年,项目经验十几页的老程序员,框架学了一大堆,可是不少 Java 相关的基础知识却不少都答不上来。还有不少人会回答,只知道要用,可是历来不会去看看它具体是怎么实现的。java
咱们都知道做为合格的程序员,基本功不扎实会致使你的程序出现许多你难以诊断的诡异问题,例如产生过大开销(频繁GC致使程序卡顿或者产生OOM),Integer 缓存机制产生的诡异现场(下面会详细说),因此就有想写一个关于面试相关系列的文章,把常见又容易采坑的面试问题总结一下,今天想站在面试官的角度去和你们聊聊一些面试的基础题目,以及尽量指导你们如何给出一个能让面试官满意的答复程序员
int 是 8 个基本数据类型(boolean, byte, short, char, int, float, double, long)之一的整形类型,大小占用4字节,取值范围是正负 2 的 32(4 * 8)次幂,Java 虽然号称一切都是对象,可是基本数据类型是例外面试
Integr 是 int 的包装类,是 JDK 1.5 中引入,提供了字符串转换,数学运算,泛型,自动拆箱装箱等实用功能,极大简化了相关的编程难度编程
下面给出一个典型例子,也是不少人踩过的坑,程序以下(建议本身在机器上实践操做下)缓存
Integer a1 = 127, b1 = 127; Integer a2 = 128, b2 = 128; System.out.println(a1 == b1); // true System.out.println(a2 == b2); // false
能够思考下为何会出现以上这种诡异的状况,而后咱们下面能够看看 Integer.valueOf 的源码安全
// Integer.valueOf 的源码 public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); } private static class IntegerCache { static final int low = -128; static final int high; static final Integer cache[]; static { int h = 127; ... high = h; } }
源码以内无秘密,咱们能够看出来出现以上问题的缘由是起因 JDK 对 Integer 构造的改进引入缓存机制致使的,传统构造 Integer 的方式是直接调用构造器 new 一个对象,可是在考察和调研后发现大多数人使用 Integer 都集中在较小的范围,所以 JDK 为 Integer.valueOf 加强了一个缓存机制来改善构造对象的性能开销(没错,自动拆箱装箱反编译后也是调用 valueOf() 方法实现构造对象)Java 官方文档给出 Integer 缓存范围是 -128 ~ 127微信
这里面细节不少,咱们就不一一讲述,到这里咱们已经能够得出结果了,就是并发
经过以上案例能够咱们能够触类旁通,不只仅 Integer 有缓存机制,整个包装类都有缓存机制:框架
若是继续深挖缓存,例如明确会频繁使用更大范围的 Integer 值得时候,咱们可使用 JVM 提供的参数工具
-XX:AutoBoxCacheMax=N
以上我只大概列出的典型回答,其实对于大多数面试能回答以上内容就已经算能够及格了,有的公司面试官以喜欢追问出名,直到候选人回答说不知道,才会打住,这道看似简单的题目,其实能够深挖的点还有不少,进一步考察你的基本功是否扎实,例如:
int 和 Integer 的区别,这算是典型高频面试题之一,也是考察候选人基本功的题目之一,若是你基本功扎实,那么这基本算是一道送分题,目前我了解的大多数大厂和重视技术的公司都是很是重视候选人的基本功,基础决定你的上限在哪里,因此这里我也建议你们不要花太多精力在框架的使用和工具的安装配置上,多沉下心的修炼基础知识,理解基础原理不只能够很好的知足平常开发,并且还能够帮助你走的更远 更多技术咨询,请关注公众号,find me !