自動裝箱和自動拆箱理解


  • 裝箱:
    • 自動將基本數據類型轉換為包裝器類型;
    • 調用方法:Integer 的 valueOf (int) 方法
  • 拆箱:
    • 自動將包裝器類型轉換為基本數據類型。
    • 調用方法:Integer 的 intValue 方法
  • ==什么時候會自動拆箱?
    • 包裝類 “==” 運算在不遇到算術運算的情況下不會自動拆箱。即只有遇到運算符才會自動拆箱。
  • 《深入理解JVM虛擬機》書中的一個測試例子及解答解析:
    • ![](https://ws1.sinaimg.cn/large/b35c33e9ly1g1wrrcutypj20hg0k80ta.jpg)

    • 解釋說明:
      • 初始化部分:所有的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。
  • 參考:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM