=========================================================================================java
在我看來,學習java最重要是要理解what(這東西是什麼),why(爲何要用它),where(在哪用它),how(怎麼用)。因此接下來,我都是以這樣的思想來和你們交流,從最基礎的知識講起。若是有啥出錯的,歡迎你們前來批評。本人虛心接納。面試
=========================================================================================學習
一.what(什麼是裝箱和拆箱)spa
咱們前面學過了基本類型int,double這些,那你們確定也見過引用類型Integer,Double等,是否是長的很像?那究竟有啥區別呢?先來講說概念。3d
(1).裝箱:把基本類型用它們相應的引用類型包裝起來,使其具備對象的性質。int包裝成Integer、float包裝成Float等。對象
(2).拆箱:和裝箱相反,將引用類型的對象簡化成值類型的數據。blog
由此可知,基本類型是沒有對象的性質,可是包裝事後的包裝器類型就具備對象性質,也固然具備更多性質和方法啦。怎麼建立一個對象呢?源碼
(3).怎麼裝箱: 在Java SE5以前,若是要生成一個數值爲10的Integer對象,必須這樣進行,這個不會觸發自動裝箱的過程:基礎
從Java SE5開始就提供了自動裝箱的特性,若是要生成一個數值爲10的Integer對象,只須要這樣就能夠了:泛型
(4).怎麼拆箱:跟裝箱對應,就是自動將包裝器類型轉換爲基本數據類型
(5).除了int,還有不少基本類型,每一個都有對應的包裝型:
二.why(爲何要用裝箱和拆箱)
(1).把一個基本類型包裝成一個類,一個是可使這個類型具備不少能夠調用的方法。
(2).java主要特色是面向對象,基本類型並不具有面向對象特性,因此要把其封裝成面向對象的類。
(3).在泛型中,基本類型是不能夠作泛型參數的。如:List <int> list = new ArrayList<int> ();這是不合法的。你只能這個樣寫List<Integer> list = new ArrayList<Integer> ();也就是要用int型的包裝類類型來解決基本類型不能夠作泛型參數的問題 。
三.How(裝箱和拆箱是怎麼實現的)
(1).在裝箱的時候自動調用的是Integer的valueOf(int)方法。而在拆箱的時候自動調用的是Integer的intValue方法。
(2).總的來講,裝箱過程是經過調用包裝器的valueOf方法實現的,而拆箱過程是經過調用包裝器的 xxxValue方法實現的。(xxx表明對應的基本數據類型,若是是int就是intValue,若是是double就是doubleValue)。
四.注意事項
包裝類型並無咱們想象的那麼簡單,面試時候別人最喜歡這樣坑人,看例子:
(1).
猜想:一看就是比較i1是否等於i2和比較i3是否等於i4,若是相等就輸出true,不然false(==號是返回Boolean類型),第一次結果是true,true,明顯相等的。然而。。。
那麼爲啥這樣??實際上是在經過valueOf方法建立Integer對象的時候,若是數值在[-128,127]之間,便返回指向IntegerCache.cache(源碼的一個方法)中已經存在的對象的引用;不然建立一個新的Integer對象。上面的代碼中i1和i2的數值爲100,所以會直接從cache中取已經存在的對象,因此i1和i2指向的是同一個對象,而i3和i4則是分別指向不一樣的對象。
(2).若是換成Double呢,看似跟上面同樣的,其實並非
具體實現,能夠去看看源碼,理解很簡單的,只不過和Integer的實現不同了。同理,其餘的基本類型也是這樣的。
(3).
Bollean就沒有什麼特別的,就單純比較相不相等。
(4).
當 「==」運算符的兩個操做數都是 包裝器類型的引用,則是比較指向的是不是同一個對象,而若是其中有一個操做數是表達式(即包含算術運算)則比較的是數值(即會觸發自動拆箱的過程),對於包裝器類型,equals方法並不會進行類型轉換。
解釋:按照上面來講,彷佛是爲false,可是呢結果確實true,爲啥呢?由於a,b,c本來都是包裝類型,也就是一個對象,固然不能相加減啦,那怎麼辦?java如今都有了自動裝箱和拆箱,當a+b時候,a和b都會自動拆箱爲基本類型,因此就成了基本類型的比較了,也就是比較數值相等不相等了,由於c=a+b因此爲true.
(5).
解釋:c.equals(a+b)會先觸發自動拆箱過程,再觸發自動裝箱過程,也就是說a+b,會先各自調用intValue方法,獲得了加法運算後的數值以後,由於equals方法並不會進行類型轉換,便調用Integer.valueOf方法,再進行equals比較。
===========================================================================
用心查閱,有心分享,分享之際,互相指教,受益你我,何樂不爲?
===========================================================================