java arrays方法_Java工具类Arrays中不得不知的常用方法
原標題:Java工具類Arrays中不得不知的常用方法
Arrays 數(shù)組操作集數(shù)組轉List ---asList
這個被“普遍”稱為數(shù)組轉List的方法,可能是Arrays內(nèi)大家使用頻率最高的一個靜態(tài)方法了。使用起來也很簡單,下面就很容易的實現(xiàn)了將數(shù)組轉為List。
當然還有另一種使用方法:
其實,個人感覺“數(shù)組轉List”這種說法是沒有意義的;我們都知道在List是一個接口,而真正實現(xiàn)了這個接口的類只有ArrayList,LinkedList,Vector。
其中ArrayList和Vector內(nèi)部都是使用“動態(tài)數(shù)組”實現(xiàn),LinkedList采用鏈表結構實現(xiàn)。
數(shù)據(jù)的物理結構只用順序存儲接口和鏈式存儲結構,List也不出其右。因此說這個方法實現(xiàn)了數(shù)組拷貝更確切一點。
下面,根據(jù)他的具體實現(xiàn),我們更能體會到拷貝的意義。
這里需要注意的是,asList內(nèi)部的ArrayList并不是我們常用的那個ArrayList,而是在Arrays類內(nèi)部的一個私有靜態(tài)類。從代碼可以看出,這個內(nèi)部的ArrayList,和常規(guī)的ArrayList相比,并沒有實現(xiàn)List接口,而是直接繼承了AbstractList。
以下所說的ArrayList 統(tǒng)一指此處的靜態(tài)類
asList的實現(xiàn)很簡單,返回了一個ArrayList的實例,參數(shù)為所要拷貝的數(shù)組名。
可以看到asList() 是接受一個泛型的變長參數(shù)的,而基本數(shù)據(jù)類型是無法被泛型化的。而對于泛型而言,基本數(shù)據(jù)類型,實際上會被人為是一個 [x 的類型。 [ 表示這是一個數(shù)組,x 為當前數(shù)組的類型。
因此,這個方法不能直接“轉換”基礎數(shù)據(jù)類型的數(shù)組。
可以看到,正常情況下,ArrayList的構造函數(shù)完成的工作就是一個賦值操作,把我們傳遞進來的數(shù)組賦給a,而a就是一個數(shù)組。
說白了,這就是一個數(shù)組拷貝的過程。再看ArrayList內(nèi)部實現(xiàn),get,set 都是根據(jù)數(shù)組下標實現(xiàn)簡單的數(shù)組賦值操作。
這里省略了ArrayList內(nèi)部幾個方法,總之都是對數(shù)組的操作,有興趣的同學,可以自行查看源碼。注意,這個類內(nèi)部,并沒有add方法的具體實現(xiàn),也就是說AbstractList內(nèi)部的add方法并沒有被覆蓋
因此,通過asList返回的List,一定不能進行add 操作,否則會拋出異常。
通過以上分析,我們可以得出以下結論:
asList 不接受基本數(shù)據(jù)類型的數(shù)組名,作為參數(shù)直接傳遞。
asList 通過backed(拷貝)的方式,返回的是一個固定長度的List,這點從方法注釋也可以看到
鑒于第二條,不能對這個返回的List執(zhí)行add 方法,可以調用set方法。
同理不能調用remove方法,但可以調用get方法獲取元素。
這里關于第一個結論,還需要解釋一下,不接受基本數(shù)據(jù)類型的數(shù)組名作為參數(shù),但是以下實現(xiàn)是可以的。
好了,Arrays.asList的用法就說到這里了。既然都到這里了,順便多說一句,List轉數(shù)組的實現(xiàn),Collection接口定義了統(tǒng)一的方法toArray。對于不同的List實現(xiàn),統(tǒng)一調用即可。
排序sort
sort() 方法顧名思義,主要是實現(xiàn)數(shù)組的排序,默認按升序進行排列。
Arrays 內(nèi)部關于sort的實現(xiàn),可以大體分為兩類,一類是基本數(shù)據(jù)類型的排序,一類是Object類型的排序。
基本數(shù)據(jù)類型的排序
sort靜態(tài)方法的實現(xiàn),按參數(shù)主要有兩種實現(xiàn)方法,一種是數(shù)組整體進行排序;一種是在數(shù)組內(nèi)指定一段起始位置進行排序,之后的對象數(shù)組排序也只是按指定起始位置排序,不再重復描述。其內(nèi)部具體實現(xiàn)是DualPivotQuicksort(雙軸快速排序)。
這里可以接收的參數(shù)類型除了int數(shù)組,還可以是long,short,char,byte,float,double類型數(shù)組。
Object 類型數(shù)組排序
實現(xiàn)Comparable接口的對象數(shù)組排序
注意,使用這個方法時,提供的“數(shù)組中的對象”必須是實現(xiàn)了Comparable接口的,也就是說必須告知明確告知,對數(shù)組中的對象是按什么規(guī)則排序。
實現(xiàn)Comparator接口的排序
使用這個方法是泛型為T的數(shù)組,需要提供一個實現(xiàn)了Comparator接口的實例,同理也是必須明確告知排序規(guī)則,如果同時實現(xiàn)了Comparable接口和Comparator接口,Comparator接口的實現(xiàn)將覆蓋Comparable接口的排序規(guī)則。
對象數(shù)組排序內(nèi)部實現(xiàn)采用了LegacyMergeSort(歸并排序)和TimSort排序。
parallelSort
parallelSort 是Java8新增的排序方式,和sort方法不同的是,他采用多線程并行的方式進行排序,當數(shù)據(jù)規(guī)模較大時和sort相比有明顯優(yōu)勢;
parallelSort 使用方式及可接受參數(shù)類型和sort方法基礎數(shù)據(jù)類型時的參數(shù)完全一致。
查找
Arrays內(nèi)部的查找,主要是binarySearch(二分查找法)。可以說,關于查找到實現(xiàn)分類和排序完全一樣。
首先從數(shù)據(jù)類型上也是分為基礎數(shù)據(jù)類型構成的數(shù)組和對象數(shù)組。都支持按特定范圍進行排序;對于對象數(shù)組的排序,對象數(shù)組需要實現(xiàn)Comparable接口或者是提供Comparator接口的實例。
元素填充
fill()方法,使用很簡單,也很好理解,將數(shù)組用特定的元素val 填滿即可,也可以是特定位置。
復制
這個方法,就是實現(xiàn)兩個將原數(shù)組按指定長度復制到目標數(shù)組內(nèi)返回。
其內(nèi)部使用System.arraycopy方法,這是一個Java提供的native方法,因此效率會高一些。Java 內(nèi)部關于數(shù)組復制的實現(xiàn),都用到了這個方法。
同樣,也包括一個copyOfRange的方法,這個按名字就可以理解,就是按照范圍進行復制。
toString
這個toString的靜態(tài)方法,其實也很實用;從下面的代碼的實現(xiàn),可以看出,他的作用就是將我們定義的數(shù)組,按照 "[a0,a1,....]"的格式轉成字符串,方便我們直接打印整個數(shù)組,打印出來的日志也會看起來更直觀,更方便。
它除了支持8種基礎數(shù)據(jù)類型的數(shù)組外,還支持Object類型的數(shù)組。
相等性equals
Arrays內(nèi)部關于兩個數(shù)組相等的判斷可以首先看下下面的代碼:
基礎數(shù)據(jù)類型數(shù)組,以long類型為例
Object 類型數(shù)組
我們知道,數(shù)組名代表數(shù)組首地址;因此,從以上代碼可以得出結論,
當兩個數(shù)組不是同一數(shù)組時,也就是a==a2 不成立。
當滿足以下任一條件時:
兩個數(shù)組中有一個為空時
兩個數(shù)組長度不等時
兩個數(shù)組中包含任意不相等的元素時
就認為兩個數(shù)組不相等,反之則認為相等。對于對象數(shù)組,相同位置的對象均為null是,認為是兩個相同的元素。
deepEquals其他數(shù)組交換
這個方法其實挺實用的,以后如果懶得寫了,可以直接一行代碼搞定。
最后
以上分析是基于Java jdk1.8 版本,在Java中由于lamdba表達式,函數(shù)式編程思想的引入,Arrays內(nèi)部新增了許多相關的類如Stream 等,考慮到使用頻率,暫時不展開討論了。返回搜狐,查看更多
責任編輯:
總結
以上是生活随笔為你收集整理的java arrays方法_Java工具类Arrays中不得不知的常用方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java转json jar包_java转
- 下一篇: java论文翻译_Java技术(外文文献