- 裝箱:
- 自動將基本數據類型轉換為包裝器類型;
- 調用方法:Integer 的 valueOf (int) 方法
- 拆箱:
- 自動將包裝器類型轉換為基本數據類型。
- 調用方法:Integer 的 intValue 方法
- ==什么時候會自動拆箱?
- 包裝類 “==” 運算在不遇到算術運算的情況下不會自動拆箱。即只有遇到運算符才會自動拆箱。
- 《深入理解JVM虛擬機》書中的一個測試例子及解答解析:
- 
- 解釋說明:
- 初始化部分:所有的Integer對象全是:Integer a=Integer.valueOf(1);
- 第一行:true。不會自動拆箱,實際比較:Integer.valueOf(3)==Integer.valueOf(3)。
- 但是Integer.valueOf方法,當-128<數值<128時,實際返回的時緩存數組里的一個對象,所以這兩個其實是同一個對象,所以返回true。
- 第二行:false。不會自動拆箱。和第一行的不同在於數值>128,每次都返回新對象。
- 第三行:true。會自動拆箱。實際是 int 的比較。
- 第四行:true。會先觸發自動拆箱過程,再觸發自動裝箱過程。
- 也就是說 a+b,會先各自調用 intValue 方法(拆箱),得到了加法運算后的數值之后,便調用 Integer.valueOf 方法(裝箱),再進行 equals 比較。
- 為什么會先拆箱?個人感覺,+運算符只對基本類型生效。所以需拆箱;
注:如有錯誤請指正。 - 為什么又裝箱?因為equals方法的參數是Object類型。
注:如有錯誤請指正。
- 第五行:true。會自動拆箱。
- 第六行:false。過程見第四行。但是為什么結果是false?因為equals方法會先看入參的類型,只有和當前對象類型一致,才比較數值;否則,返回false。
- 
- 參考:
- 深入剖析 Java 中的裝箱和拆箱 - Matrix 海子 - 博客園 https://www.cnblogs.com/dolphin0520/p/3780005.html
注:很深入,很全,多了解。 - java 自動裝箱與拆箱? - 知乎 https://www.zhihu.com/question/28502011/answer/41084913
注:書上的答案。 - java中的 == 號判斷,為什么基本數據類型就是比較內容,而對象則是比較地址? - 知乎 https://www.zhihu.com/question/29451160
- 深入剖析 Java 中的裝箱和拆箱 - Matrix 海子 - 博客園 https://www.cnblogs.com/dolphin0520/p/3780005.html