話題一:valueOf()與xxxValue()
我們知道JAVA存在自動裝箱和拆箱的功能,這個過程是JAVA直接幫助我們做了,很多時候是悄悄的,而且是無處不在的。比如直接将基本數值指派給包裝類型的變量,比如在集合中我們放入的都必須是對象。而這個過程都是調用了什麼方法來實作的呢?讓我們來看看代碼,一探究竟:
以Integer為例,看valueOf()和intValue()的實作方式。
<a href="http://s3.51cto.com/wyfs02/M01/72/5B/wKiom1XhgCuzHLECAACAuNo87NQ546.jpg" target="_blank"></a>
valueOf()是JAVA用于将基本資料類型轉化成包裝類型所調用的方法,即完成自動裝箱的功能。
上面的代碼很好懂,也就是說:i在某個區間,則傳回一個數組的元素,否則new一個Integer傳回!
跟蹤代碼,可以發現IntegerCache.high其實是127.
那麼如果對-128<=I<=127來自動裝箱的話,得到的是數組的元素,即指向的是同一塊記憶體空間!
來看一段測試代碼:
<a href="http://s3.51cto.com/wyfs02/M00/72/5C/wKiom1Xhg33BDFa8AAB3MhKqYCE168.jpg" target="_blank"></a>
一個true,一個false,就好了解了。
true,是因為i1,i2指向的都是cache數組裡面的同一個東西,而非Integer可以用 == 來進行比較!
Integer也肯定重寫了equals()方法來實作值比較:
<a href="http://s3.51cto.com/wyfs02/M00/72/58/wKioL1XhhvnS96sSAAByypGX7Do835.jpg" target="_blank"></a>
感悟:
連Integer都利用到了緩存思想!
下面,我們來看看實作自動拆箱功能的intValue()方法:
<a href="http://s3.51cto.com/wyfs02/M01/72/58/wKioL1XhiG_gtfzUAAAleeuTZpI405.jpg" target="_blank"></a>
很簡單,傳回value,這個value又是什麼呢?
<a href="http://s3.51cto.com/wyfs02/M02/72/58/wKioL1XhiJLBkSS4AAAfabitUX0809.jpg" target="_blank"></a>
這說明Integer一旦設定完畢,就不可改動了!可以發現Integer也沒有提供set方法。
話題二:包裝類型和基本類型的比較
看一段代碼:
<a href="http://s3.51cto.com/wyfs02/M00/72/5E/wKioL1XiUKfglgRSAABupEi9UIc677.jpg" target="_blank"></a>
在上面的例子中,包裝類型和基本類型在比較的時候,是先統一轉化成Integer呢?還是int呢?
如果是轉成Integer,那麼顯然應該一個是false,一個是true.
其實最後的運作結果是2個都是true.
這說明,在比較過程中,是優先向基本資料類型轉化的!
話題三:Collections
在實際開發中,集合和數組是我們用的比較多的,而Collections/Arrays封裝了很多功能供我們調用,而且可以滿足我們的大部分開發需求,是以了解他們都有些什麼很有必要!
Collections:
sort功能
<a href="http://s3.51cto.com/wyfs02/M00/72/5E/wKioL1XiU9nQw94oAABfBlxRhtk546.jpg" target="_blank"></a>
專門針對LIST進行排序,在實際開發中,我們确實經常需要對一個裝有一些對象的LIST進行排序!
min和max
<a href="http://s3.51cto.com/wyfs02/M01/72/62/wKiom1XiUm3zU86CAACqBCF1SC0341.jpg" target="_blank"></a>
如果,我們想取一個集合中的最小、最大值,如何快速的取到呢?上面的方法将幫我們實作。
反轉
<a href="http://s3.51cto.com/wyfs02/M02/72/62/wKiom1XiU7uBm0qtAAAe_F_9gEU814.jpg" target="_blank"></a>
如果,我們僅僅需要得到一個LIST的相反順序!
混排列
<a href="http://s3.51cto.com/wyfs02/M02/72/62/wKiom1XiVsuCetCoAAAbtHoA7jM320.jpg" target="_blank"></a>
通過這個方法,将使得LIST中元素的順序不可預測,即順序是随機的,混排的。
這有什麼用呢?
比如,在有的業務中,我們希望對外提供的資料是“變化的”,假設電商APP,使用者看到的始終是不變的商品,又有什麼購買的興趣呢?利用随機的特點,讓使用者每次看到的都不一樣!
拷貝
<a href="http://s3.51cto.com/wyfs02/M02/72/62/wKiom1XiWO_zMkcTAAA1TnibLUw385.jpg" target="_blank"></a>
複制的操作常有,需要注意的是dest list的長度需要>=src list的長度,拷貝從index=0開始,而且是淺拷貝!
查找目标LIST出現的FIRST/LAST的索引位置
<a href="http://s3.51cto.com/wyfs02/M01/72/5F/wKioL1XiX_miK-FHAAA7e7d0IHQ838.jpg" target="_blank"></a>
我們可以來看看源碼是怎麼實作的:
<a href="http://s3.51cto.com/wyfs02/M00/72/62/wKiom1XiXxTz3lMtAAM5zd0ZPR8371.jpg" target="_blank"></a>
說明:
如果這個功能我們自己來做,會如何做呢?
對于在源list1中查找目标list2,很顯然,首先周遊list1,從index=0開始查找每個元素是否和list2對應一緻,如果不一緻,從index=1開始重複這個過程。
上面的代碼,分為普通for版本和iterator版本,思想是一緻的。
需要注意的是,内層for循環中的continue并不是想開始下一次内層for循環,而是想導緻外層for循環開始下一次,為了達到這個目的,用到了continue lable;
循環移動Rotate
<a href="http://s3.51cto.com/wyfs02/M00/72/62/wKiom1XiYwKzFhFFAAA9rSzFQXo492.jpg" target="_blank"></a>
如果,我們想把list中的前幾個移動到最後去,或者後幾個移動到前面,rotate就可以排上用場了!
他是怎麼實作的呢?好像一下子沒什麼頭緒?看看源碼是怎麼做的:
<a href="http://s3.51cto.com/wyfs02/M00/72/63/wKiom1XiambxxWrhAADB3iMXAHU358.jpg" target="_blank"></a>
示意如下:
<a href="http://s3.51cto.com/wyfs02/M01/72/63/wKiom1XiayfBbevFAACPvpCuG-0267.jpg" target="_blank"></a>
僅僅幾個reverse就實作了,原來如此簡單!
這說明,一些看似複雜的功能,都是由一些小功能組裝實作的!
話題四:Arrays
集合雖然好,但是我們有時候隻想對基本類型資料進行操作,那麼可能就少不了數組了,而Arrays正好提供了一些功能給我們使用,大緻如下:
排序功能sort:
<a href="http://s3.51cto.com/wyfs02/M00/72/5F/wKioL1XicRXwXuNaAAD9mnPui6k863.jpg" target="_blank"></a>
好多排序啊~
對數組的所有元素排序?對數組的一定範圍的元素排序?想根據自己制定的排序器來排序?
Arrays.sort都可以滿足你!
數組比較功能equals
<a href="http://s3.51cto.com/wyfs02/M01/72/60/wKioL1XiclbTdvU1AADFk6R7J_I735.jpg" target="_blank"></a>
如果讓我們自己來比較2個數組的元素是否相等,那麼我們得判斷長度,在FOR循環去比較2個數組的對應元素是否相等了,現在Arrays.equals已經将這些邏輯封裝好了,一行代碼就搞定了~
可以看一眼他的邏輯:
<a href="http://s3.51cto.com/wyfs02/M02/72/63/wKiom1XicXazi0MNAADH87u01q8470.jpg" target="_blank"></a>
是否是同一個對象?NULL檢查?長度判斷?這些你會在FOR比較前注意嗎?
查找數組元素binarySearch
<a href="http://s3.51cto.com/wyfs02/M01/72/60/wKioL1XidCqTq1sDAAEMmE5O_DQ468.jpg" target="_blank"></a>
這個是需要有序的數組來實作二分查找的。
全部元素查找?部分元素查找?指定比較器排序後在進行查找?
都可以~
填充數組功能fill
數組的toString()功能
要知道,我們有時候調試程式的時候,經常需要列印下數組的元素,不得不寫個FOR循環周遊,而Arrays提供便利的toString()傳回逗号分隔的元素清單。
本文轉自zfz_linux_boy 51CTO部落格,原文連結:http://blog.51cto.com/zhangfengzhe/1689732,如需轉載請自行聯系原作者