關於 Integer,你要知道的事

Photo By Instagram sooyaaa

問題 11

前段時間在脈脈上看到一位面試官分享出來的一道關於 Integer 的面試題目,當時看了以後心裏有點猶豫,知道 Integer 有緩存,但是這道題目還是做的有些猶豫,於是仔細琢磨了一下這道題目,分享給大家。題目如下,要求回答出輸出結果,並說明爲什麼?

 1int a = 1;
 2Integer b = 1;
 3Integer c = 1;
 4Integer d = Integer.valueOf(1);
 5Integer e = new Integer(1);
 6Integer f = new Integer(1);
 7
 8Integer g = 128;
 9Integer h = Integer.valueOf(128);
10
11System.out.println(a == b);
12System.out.println(b == c);
13System.out.println(c == d); 
14System.out.println(d == e);
15System.out.println(e == f);
16System.out.println(g == h);

我的答案

這道題目本身沒什麼難度,主要考察你是不是有好奇心,對平時的工作中經常用到的一些工具類是不是熟悉。要想做對這道題需要知道如下 2 點:


自動拆裝箱

自動拆裝箱就不用多說了,int 賦值給 Integer 的時候會發生自動裝箱操作,Integer 賦值給 int 的時候會發生自動拆箱操作。在 a == b 的表達式中,b 發生了自動拆箱操作轉換爲了它對應的 int 值。因此 a == b 輸出爲 true。在賦值語句 Integer b = 1 出現的時候發生了自動裝箱操作,這個裝箱操作實際使用了 Integer 的靜態工廠方法 Integer.valueOf(),然後得到一個 Integer 對象。既然是這樣,那麼 b == c,顯然輸出 true。d 直接使用了工廠方法來構造,很明顯 c == d 會輸出 true。


緩存

接下來就比較好玩了,我們使用 new 初始化出來的對象和使用工廠方法構造出來的對象相等嗎?如果看過 Integer 的源碼你會知道,他倆是不相等的。我們都知道 == 比較的是對象的地址,有些人知道 Integer 有緩存功能,誤認爲使用 new 初始化 Integer 對象的時候也使用了緩存。然而並不是,只有在使用了 Integer 靜態工廠方法時候纔會使用 Integer 的緩存對象。由此我們可以得出 d == e 會輸出 false,e == f 也會輸出 false。

g 和 h 的比較在考察 Integer 緩存的大小了,默認情況下 JVM 緩存的整數大小是 -128 - 127,這個大小我們是可以通過參數更改的,例如我們讓他可以緩存 -128 - 200 的整數,可以給 JVM 設置如下參數:

1-XX:AutoBoxCacheMax=128

如果添加了如上的參數設置,那麼 g == h 會輸出 true,因爲他們都使用了事先初始化好的緩存對象。假設使用了默認的 JVM 參數配置,那麼會輸出 false,因爲他們會被構造爲 2 個不同的對象。那麼 JVM 爲什麼設置這個緩存呢?當然是爲了性能啦,典型的以空間換時間的策略。

以上就是我對於 Integer 的理解啦,小夥伴們趕緊去學習一下,有問題可以和我討論哦。

以上即爲昨天的問題的答案,小夥伴們對這個答案是否滿意呢?歡迎留言和我討論。

又要到年末了,你是不是又悄咪咪的開始看機會啦。爲了廣大小夥伴能充足電量,能順利通過 BAT 的面試官無情三連炮,我特意推出大型刷題節目。每天一道題目,第二天給答案,前一天給小夥伴們獨立思考的機會。

點下“在看”,鼓勵一下?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章