Hold住面試官之Integer Cache

2021-09-24 07:55:59 字數 1759 閱讀 3933

前言

最近跟許多朋友聊了下,在這個「跳槽」的**季節,大家都有點蠢蠢欲動,所以最近就多聊聊面試的時候需要注意的一些問題,這些問題不一定多深奧,多複雜,但是一不注意的話卻容易掉坑。下面看一下面試的時候經常遇到的一段**:

public class integerdemo 

}複製**

根據大家以往的經驗,會認為上面的**用「==「符號來比較,對比的是物件的引用,那麼abcd是不同的物件,所以輸出當然是false了。我在《「==」、「equals()」、「hashcode()」之間的秘密》這篇文章也討論過。那麼事實也是如此嗎?下面看一下輸出結果:

numa == numb : true

numc == numd : false

複製**

what?這個輸出結果怎麼跟以往的認知有所出入呢?在我們的**「integer numa = 127」中,編譯器會把基本資料的「自動裝箱」(autoboxing)成包裝類,所以這行**就等價於「integer numa = integer.valueof(127)」了,這樣我們就可以進入valueof方法檢視它的實現原理。

//integer valueof方法    

public static integer valueof(int i)

//integer靜態內部類

private static class integercache catch( numberformatexception nfe)

}high = h;

cache = new integer[(high - low) + 1];

int j = low;

for(int k = 0; k < cache.length; k++)

cache[k] = new integer(j++);

// range [-128, 127] must be interned (jls7 5.1.7)

assert integercache.high >= 127;

}private integercache

() {}

}複製**

從上面的原始碼可以看到,valueof方法會先判斷傳進來的引數是否在integercache的low與high之間,如果是的話就返回cache陣列裡面的快取值,不是的話就new integer(i)返回。

那我們再往上看一下integercache,它是integer的內部靜態類,low預設是-128,high的值預設127,但是high可以通過jvm啟動引數xx:autoboxcachemax=size來修改(如圖),如果我們按照這樣修改了,然後再次執行上面**,這時候2次輸出都是true,因為快取的區間變成-128~200了。

但是如果我們是通過構造器來生成乙個integer物件的話,下面的輸出都是false。因為這樣不會走valueof方法,所以按照正常的物件對比邏輯即可。

public class integerdemo 

}複製**

還有需要注意的一點是,此類快取行為不僅存在於integer物件。還存在於其他的整數型別byte,short,long,character。但是能改變快取範圍的就只有integer了。

結語有時候往往越簡單的知識越容易掉坑里,所以要保持自己的求知慾,不斷鞏固的基礎,才能讓自己在面試的時候不會栽跟頭。

文章推薦

redis的正確使用姿勢

一文徹底搞懂面試中常問的各種「鎖」

那些年我們一起踩過的dubbo坑

吊打面試官之HashMap

hashmap的底層資料結構是什麼?jdk1.7和jdk1.7前使用的是陣列,鍊錶 jdk1.8和jdk1.8後使用的是陣列,鍊錶,紅黑樹 hashmap的put方法流程是怎麼樣的?1.先獲取key的hash值 注意 通過key獲取hash值,直接獲取hash值就可以了,但是這裡把key的hash值...

面試官感悟

其實之前也面試過幾個人,但都是零星的跟著別人一起,我也只是偶爾詢問一兩句就結束了。昨天這是一場真正的大型招聘會,而且面試也是相當規範,面對的還是社招。對於我這種初出茅廬來說,這是第一次真正接觸參與的一場招聘會,想起要面那些比自己工作年限還長的人,心裡很沒底,有點小擔心和緊張的。當然一整天下來也算體驗...

面試官問題

解釋一些壓縮感知理論 壓縮感知是一種全新的訊號採集和恢復理論,它打破了傳統的奈奎斯特取樣定律,可以從更少的觀測訊號訊號中重建出高質量的原始訊號。其基本思想是,當訊號是稀疏或可壓縮時,我們可以通過乙個隨機測量矩陣將高維訊號投影到低維空間,再通過乙個求解優化問題高概率的恢復原始訊號。解釋一下壓縮感知磁共...