天天看點

Java功底篇系列-04-基本類型/包裝類型/Collections/Arrays

話題一: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&lt;=I&lt;=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的長度需要&gt;=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,如需轉載請自行聯系原作者