日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

java arrays方法_Java工具类Arrays中不得不知的常用方法

發(fā)布時(shí)間:2024/10/8 java 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java arrays方法_Java工具类Arrays中不得不知的常用方法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原標(biāo)題:Java工具類Arrays中不得不知的常用方法

Arrays 數(shù)組操作集數(shù)組轉(zhuǎn)List ---asList

這個(gè)被“普遍”稱為數(shù)組轉(zhuǎn)List的方法,可能是Arrays內(nèi)大家使用頻率最高的一個(gè)靜態(tài)方法了。使用起來(lái)也很簡(jiǎn)單,下面就很容易的實(shí)現(xiàn)了將數(shù)組轉(zhuǎn)為L(zhǎng)ist。

當(dāng)然還有另一種使用方法:

其實(shí),個(gè)人感覺(jué)“數(shù)組轉(zhuǎn)List”這種說(shuō)法是沒(méi)有意義的;我們都知道在List是一個(gè)接口,而真正實(shí)現(xiàn)了這個(gè)接口的類只有ArrayList,LinkedList,Vector。

其中ArrayList和Vector內(nèi)部都是使用“動(dòng)態(tài)數(shù)組”實(shí)現(xiàn),LinkedList采用鏈表結(jié)構(gòu)實(shí)現(xiàn)。

數(shù)據(jù)的物理結(jié)構(gòu)只用順序存儲(chǔ)接口和鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),List也不出其右。因此說(shuō)這個(gè)方法實(shí)現(xiàn)了數(shù)組拷貝更確切一點(diǎn)。

下面,根據(jù)他的具體實(shí)現(xiàn),我們更能體會(huì)到拷貝的意義。

這里需要注意的是,asList內(nèi)部的ArrayList并不是我們常用的那個(gè)ArrayList,而是在Arrays類內(nèi)部的一個(gè)私有靜態(tài)類。從代碼可以看出,這個(gè)內(nèi)部的ArrayList,和常規(guī)的ArrayList相比,并沒(méi)有實(shí)現(xiàn)List接口,而是直接繼承了AbstractList。

以下所說(shuō)的ArrayList 統(tǒng)一指此處的靜態(tài)類

asList的實(shí)現(xiàn)很簡(jiǎn)單,返回了一個(gè)ArrayList的實(shí)例,參數(shù)為所要拷貝的數(shù)組名。

可以看到asList() 是接受一個(gè)泛型的變長(zhǎng)參數(shù)的,而基本數(shù)據(jù)類型是無(wú)法被泛型化的。而對(duì)于泛型而言,基本數(shù)據(jù)類型,實(shí)際上會(huì)被人為是一個(gè) [x 的類型。 [ 表示這是一個(gè)數(shù)組,x 為當(dāng)前數(shù)組的類型。

因此,這個(gè)方法不能直接“轉(zhuǎn)換”基礎(chǔ)數(shù)據(jù)類型的數(shù)組。

可以看到,正常情況下,ArrayList的構(gòu)造函數(shù)完成的工作就是一個(gè)賦值操作,把我們傳遞進(jìn)來(lái)的數(shù)組賦給a,而a就是一個(gè)數(shù)組。

說(shuō)白了,這就是一個(gè)數(shù)組拷貝的過(guò)程。再看ArrayList內(nèi)部實(shí)現(xiàn),get,set 都是根據(jù)數(shù)組下標(biāo)實(shí)現(xiàn)簡(jiǎn)單的數(shù)組賦值操作。

這里省略了ArrayList內(nèi)部幾個(gè)方法,總之都是對(duì)數(shù)組的操作,有興趣的同學(xué),可以自行查看源碼。注意,這個(gè)類內(nèi)部,并沒(méi)有add方法的具體實(shí)現(xiàn),也就是說(shuō)AbstractList內(nèi)部的add方法并沒(méi)有被覆蓋

因此,通過(guò)asList返回的List,一定不能進(jìn)行add 操作,否則會(huì)拋出異常。

通過(guò)以上分析,我們可以得出以下結(jié)論:

asList 不接受基本數(shù)據(jù)類型的數(shù)組名,作為參數(shù)直接傳遞。

asList 通過(guò)backed(拷貝)的方式,返回的是一個(gè)固定長(zhǎng)度的List,這點(diǎn)從方法注釋也可以看到

鑒于第二條,不能對(duì)這個(gè)返回的List執(zhí)行add 方法,可以調(diào)用set方法。

同理不能調(diào)用remove方法,但可以調(diào)用get方法獲取元素。

這里關(guān)于第一個(gè)結(jié)論,還需要解釋一下,不接受基本數(shù)據(jù)類型的數(shù)組名作為參數(shù),但是以下實(shí)現(xiàn)是可以的。

好了,Arrays.asList的用法就說(shuō)到這里了。既然都到這里了,順便多說(shuō)一句,List轉(zhuǎn)數(shù)組的實(shí)現(xiàn),Collection接口定義了統(tǒng)一的方法toArray。對(duì)于不同的List實(shí)現(xiàn),統(tǒng)一調(diào)用即可。

排序sort

sort() 方法顧名思義,主要是實(shí)現(xiàn)數(shù)組的排序,默認(rèn)按升序進(jìn)行排列。

Arrays 內(nèi)部關(guān)于sort的實(shí)現(xiàn),可以大體分為兩類,一類是基本數(shù)據(jù)類型的排序,一類是Object類型的排序。

基本數(shù)據(jù)類型的排序

sort靜態(tài)方法的實(shí)現(xiàn),按參數(shù)主要有兩種實(shí)現(xiàn)方法,一種是數(shù)組整體進(jìn)行排序;一種是在數(shù)組內(nèi)指定一段起始位置進(jìn)行排序,之后的對(duì)象數(shù)組排序也只是按指定起始位置排序,不再重復(fù)描述。其內(nèi)部具體實(shí)現(xiàn)是DualPivotQuicksort(雙軸快速排序)。

這里可以接收的參數(shù)類型除了int數(shù)組,還可以是long,short,char,byte,float,double類型數(shù)組。

Object 類型數(shù)組排序

實(shí)現(xiàn)Comparable接口的對(duì)象數(shù)組排序

注意,使用這個(gè)方法時(shí),提供的“數(shù)組中的對(duì)象”必須是實(shí)現(xiàn)了Comparable接口的,也就是說(shuō)必須告知明確告知,對(duì)數(shù)組中的對(duì)象是按什么規(guī)則排序。

實(shí)現(xiàn)Comparator接口的排序

使用這個(gè)方法是泛型為T的數(shù)組,需要提供一個(gè)實(shí)現(xiàn)了Comparator接口的實(shí)例,同理也是必須明確告知排序規(guī)則,如果同時(shí)實(shí)現(xiàn)了Comparable接口和Comparator接口,Comparator接口的實(shí)現(xiàn)將覆蓋Comparable接口的排序規(guī)則。

對(duì)象數(shù)組排序內(nèi)部實(shí)現(xiàn)采用了LegacyMergeSort(歸并排序)和TimSort排序。

parallelSort

parallelSort 是Java8新增的排序方式,和sort方法不同的是,他采用多線程并行的方式進(jìn)行排序,當(dāng)數(shù)據(jù)規(guī)模較大時(shí)和sort相比有明顯優(yōu)勢(shì);

parallelSort 使用方式及可接受參數(shù)類型和sort方法基礎(chǔ)數(shù)據(jù)類型時(shí)的參數(shù)完全一致。

查找

Arrays內(nèi)部的查找,主要是binarySearch(二分查找法)。可以說(shuō),關(guān)于查找到實(shí)現(xiàn)分類和排序完全一樣。

首先從數(shù)據(jù)類型上也是分為基礎(chǔ)數(shù)據(jù)類型構(gòu)成的數(shù)組和對(duì)象數(shù)組。都支持按特定范圍進(jìn)行排序;對(duì)于對(duì)象數(shù)組的排序,對(duì)象數(shù)組需要實(shí)現(xiàn)Comparable接口或者是提供Comparator接口的實(shí)例。

元素填充

fill()方法,使用很簡(jiǎn)單,也很好理解,將數(shù)組用特定的元素val 填滿即可,也可以是特定位置。

復(fù)制

這個(gè)方法,就是實(shí)現(xiàn)兩個(gè)將原數(shù)組按指定長(zhǎng)度復(fù)制到目標(biāo)數(shù)組內(nèi)返回。

其內(nèi)部使用System.arraycopy方法,這是一個(gè)Java提供的native方法,因此效率會(huì)高一些。Java 內(nèi)部關(guān)于數(shù)組復(fù)制的實(shí)現(xiàn),都用到了這個(gè)方法。

同樣,也包括一個(gè)copyOfRange的方法,這個(gè)按名字就可以理解,就是按照范圍進(jìn)行復(fù)制。

toString

這個(gè)toString的靜態(tài)方法,其實(shí)也很實(shí)用;從下面的代碼的實(shí)現(xiàn),可以看出,他的作用就是將我們定義的數(shù)組,按照 "[a0,a1,....]"的格式轉(zhuǎn)成字符串,方便我們直接打印整個(gè)數(shù)組,打印出來(lái)的日志也會(huì)看起來(lái)更直觀,更方便。

它除了支持8種基礎(chǔ)數(shù)據(jù)類型的數(shù)組外,還支持Object類型的數(shù)組。

相等性equals

Arrays內(nèi)部關(guān)于兩個(gè)數(shù)組相等的判斷可以首先看下下面的代碼:

基礎(chǔ)數(shù)據(jù)類型數(shù)組,以long類型為例

Object 類型數(shù)組

我們知道,數(shù)組名代表數(shù)組首地址;因此,從以上代碼可以得出結(jié)論,

當(dāng)兩個(gè)數(shù)組不是同一數(shù)組時(shí),也就是a==a2 不成立。

當(dāng)滿足以下任一條件時(shí):

兩個(gè)數(shù)組中有一個(gè)為空時(shí)

兩個(gè)數(shù)組長(zhǎng)度不等時(shí)

兩個(gè)數(shù)組中包含任意不相等的元素時(shí)

就認(rèn)為兩個(gè)數(shù)組不相等,反之則認(rèn)為相等。對(duì)于對(duì)象數(shù)組,相同位置的對(duì)象均為null是,認(rèn)為是兩個(gè)相同的元素。

deepEquals其他數(shù)組交換

這個(gè)方法其實(shí)挺實(shí)用的,以后如果懶得寫了,可以直接一行代碼搞定。

最后

以上分析是基于Java jdk1.8 版本,在Java中由于lamdba表達(dá)式,函數(shù)式編程思想的引入,Arrays內(nèi)部新增了許多相關(guān)的類如Stream 等,考慮到使用頻率,暫時(shí)不展開(kāi)討論了。返回搜狐,查看更多

責(zé)任編輯:

總結(jié)

以上是生活随笔為你收集整理的java arrays方法_Java工具类Arrays中不得不知的常用方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。