1. 程式人生 > 程式設計 >自動裝箱?拆箱?==問題?詳解java面試常見的一個問題

自動裝箱?拆箱?==問題?詳解java面試常見的一個問題

1:前言

相信大家都在面試中都被問到過一個問題,這個問題也是近年來面試官刁難人比較常見的一個問題,所以也被大家所熟知了,本質上也很簡單,但是也是非常基礎的一個題目。

Integer a = 100;
Integer b = 100;
System.out.println(a == b);
Integer a = 180;
Integer b = 180;
System.out.println(a == b);
複製程式碼

題目也就是讓你回答一下上面的輸出情況,顯而易見第一個是true,第二個是false,這個大家應該都知道了


2:自動裝箱和拆箱

我們都知道!java的核心思想是:萬物皆物件,但是,實際上為了平時寫程式碼的便利性,還是保留了8個基礎資料型別:byte,short,char,int,long,float,double 和 boolean

那麼問題來了:下面這種情況怎麼操作

//a是Integer物件型別,100是基礎int型別
Integer a = 100;
複製程式碼

這個時候我們聰明的編譯器就會呼叫valueOf去做裝箱為物件

自動拆箱就正好反過來使用物件的intValue()方法區拆箱為基礎資料型別

3:解答上面的 == 不一樣的問題

那麼我們在溫故一下上面那個問題好了,額外我再加一個幹擾項

Integer a = 100;
Integer b = 100;
System.out.println(a == b);  // -> true

Integer a = 180;
Integer b = 180;
System.out.println(a == b); // -> false
Integer a = new Integer(100); Integer b = new Integer(100); System.out.println(a == b); // -> false 複製程式碼

所以我們要先理解==的意思,基礎型別==是比較值是否相等,物件型別是比較記憶體地址是否相同

那麼我們結合Integer.valueOf()程式碼就可以知道,我們在裝箱的時候會進行一次快取判斷,在[-128,127]範圍內的時候,會取一個快取物件,所以 a和b物件是同一個當然是true,第二個180超出範圍了,就會new一個新的Integer物件,記憶體地址肯定不一樣

那麼最後一題,new Integer(100)實際上是直接自己new了物件,沒有用到裝箱,不過我想一般也沒人這麼用吧···

4:總結

其實java中很多設計的小細節,小問題都包含了設計者們的智慧和心血,我們在看這些面試小問題的時候,應該仔細琢磨琢磨為什麼這麼設計,然後自己在實際的工作中也可以去運用這些巧妙的設計和知識!!