最近面試了不少候選人,發現不少人都不過重視基礎,甚至連工做十幾年,項目經驗十幾頁的老程序員,框架學了一大堆,可是不少 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 !