Java开发笔记(二十三)数组工具Arrays
數(shù)組作為一種組合形式的數(shù)據(jù)類型,必然要求提供一些處理數(shù)組的簡(jiǎn)便辦法,包括數(shù)組比較、數(shù)組復(fù)制、數(shù)組排序等等。為此Java專門設(shè)計(jì)了Arrays工具,該工具包含了幾個(gè)常用方法,方便程序員對(duì)數(shù)組進(jìn)行加工操作。Arrays工具的方法說明如下:
Arrays.equals(a1, a2); // 判斷a1和a2兩個(gè)數(shù)組是否相等,也就是每個(gè)元素是否都相等Arrays.fill(a, val); // 往數(shù)組a全部填入指定的數(shù)值valdest = Arrays.copyOf(src, newLength); // 把數(shù)組src的內(nèi)容賦值給數(shù)組dest,且dest的長度為newLengthArrays.sort(a); // 對(duì)數(shù)組a的內(nèi)部元素進(jìn)行排序,結(jié)果是按照升序排序?
下面分別對(duì)以上的四個(gè)數(shù)組處理方法進(jìn)行介紹:
1、Arrays.equals方法
前面說過,雙等號(hào)“==”可用來判斷兩個(gè)變量的數(shù)值是否相等,但“==”只適合基本變量類型之間的比較,例如比較兩個(gè)整型變量是否相等、兩個(gè)雙精度數(shù)是否相等、兩個(gè)布爾變量是否相等。如果兩個(gè)數(shù)組變量通過“==”進(jìn)行相等判斷,則比較的是這兩個(gè)數(shù)組是否為同一個(gè)數(shù)組,而不是比較兩個(gè)數(shù)組的所有元素是否都相等。要想判斷兩個(gè)數(shù)組內(nèi)部的每個(gè)元素是否一一相等,就必須通過Arrays工具的equals方法來辨別。equals方法返回true表示兩個(gè)數(shù)組的所有元素都相等,返回false表示兩個(gè)數(shù)組至少有一個(gè)元素不相等。
2、Arrays.fill方法
在聲明數(shù)組變量的時(shí)候,經(jīng)常需要對(duì)它進(jìn)行初始化賦值,比如書店進(jìn)了十本書,每本書的售價(jià)都是99元,那么按照常規(guī)寫法只能書寫十遍99,就像下面代碼這樣:
?
顯然輸入重復(fù)的數(shù)字是個(gè)負(fù)擔(dān),尤其重復(fù)數(shù)量很多的時(shí)候更甚。現(xiàn)在利用Arrays的fill方法,只需一行代碼即可對(duì)該數(shù)組的所有元素都填上相同的數(shù)值,于是數(shù)組的初始賦值代碼便優(yōu)化為下面這樣:
// 聲明一個(gè)整型數(shù)組,數(shù)組大小為10int[] prices = new int[10];// 給整型數(shù)組的每個(gè)元素全部填寫99Arrays.fill(prices, 99);// 打印整型數(shù)組的所有元素?cái)?shù)值for (int price : prices) {System.out.println("price = "+price);}
3、Arrays.copyOf方法
把一個(gè)數(shù)組變量賦值給另一個(gè)數(shù)組變量,似乎可以用等號(hào)直接賦值,這種情況在一般情況下沒有問題。但若是賦值之后修改了原數(shù)組的某個(gè)元素,那就出現(xiàn)問題了。譬如以下的演示代碼,先把數(shù)組變量pricesOrigin賦值給pricesAssign,接著修改原數(shù)組pricesOrigin的元素值,再去打印新數(shù)組pricesAssign的所有元素:
?
運(yùn)行以上的演示代碼,完整的日志輸出如下所示:
assign price = 99 assign price = 80 assign price = 99 assign price = 99 assign price = 99?
沒想到打印出來的第二個(gè)數(shù)組元素竟然變了,可是演示代碼明明只改了原數(shù)組pricesOrigin,并未修改新數(shù)組pricesAssign呀。讓測(cè)試程序出現(xiàn)神經(jīng)錯(cuò)亂的緣故,乃是數(shù)組之間的等號(hào)賦值相當(dāng)于給數(shù)組起個(gè)別名,并非從頭到尾完整復(fù)制一個(gè)新數(shù)組出來。既然只是起了個(gè)別的名稱,那么實(shí)際上還是原名稱所指的數(shù)組,無非是該數(shù)組有兩個(gè)姓名罷了。
顯然這個(gè)情況不是程序員期望的結(jié)果,程序員的本意是復(fù)制另外的數(shù)組,新數(shù)組不再與原數(shù)組有任何關(guān)聯(lián),大家井水不犯河水,互不干涉、互不影響。最好克隆一個(gè)一模一樣的新數(shù)組出來,Java恰巧給每個(gè)數(shù)組變量都提供了clone方法,該方法正是拿來克隆數(shù)組用的。克隆出來的新數(shù)組有分配單獨(dú)的存儲(chǔ)空間,并且數(shù)組元素的數(shù)值與原數(shù)組完全一致,如此便實(shí)現(xiàn)了正常意義上的數(shù)組賦值功能。利用clone方法復(fù)制數(shù)組變量的示例代碼如下:
?
運(yùn)行如上的示例代碼,得到下面的日志輸出結(jié)果:
clone price = 99 clone price = 99 clone price = 99 clone price = 99 clone price = 99?
可見此時(shí)修改了原數(shù)組的元素?cái)?shù)值,并沒有改變新數(shù)組的元素值,真正做到了完整的復(fù)制操作。
不過clone方法人如其名,它把原數(shù)組的所有元素一個(gè)不漏全部復(fù)制到新數(shù)組,這意味著,如果只想復(fù)制部分元素給新數(shù)組,那末clone方法就無能為力了。為此,Java給Arrays工具增配了一個(gè)copyOf方法,該方法允許從來源數(shù)組復(fù)制若干元素給目標(biāo)數(shù)組。當(dāng)待復(fù)制的元素個(gè)數(shù)恰好等于原數(shù)組的大小時(shí),copyOf方法的作用等同于數(shù)組變量的clone方法。下面是通過copyOf方法將數(shù)組原樣復(fù)制到新數(shù)組的代碼例子:
?
從上面代碼看到,copyOf方法身后跟著兩個(gè)參數(shù),第一個(gè)參數(shù)是原數(shù)組的名稱,第二個(gè)參數(shù)是要復(fù)制的元素個(gè)數(shù)。接下來把第二個(gè)參數(shù)改小一點(diǎn),看看copyOf方法是否真的支持只復(fù)制部分元素?于是第二個(gè)參數(shù)改為“pricesOrigin.length-1”之后的代碼如下所示:
// 改變copyOf方法的第二個(gè)參數(shù)值,允許復(fù)制指定大小的數(shù)組元素int[] pricesPart = Arrays.copyOf(pricesOrigin, pricesOrigin.length-1);for (int price : pricesPart) {System.out.println("part price = "+price);}?
重新運(yùn)行修改后的數(shù)組復(fù)制代碼,日志輸出結(jié)果見下:
part price = 99 part price = 99 part price = 99 part price = 99?
這下看到新數(shù)組的元素只有四個(gè),而原數(shù)組共有五個(gè)元素,說明此時(shí)的確只復(fù)制了部分元素。
Arrays工具的copyOf方法還有個(gè)妙用,比如有個(gè)數(shù)組分配了初始大小為5,現(xiàn)在想把該數(shù)組的長度擴(kuò)大到10,這時(shí)利用copyOf方法就能動(dòng)態(tài)調(diào)整數(shù)組的大小。具體做法是:調(diào)用copyOf方法之時(shí),來源數(shù)組和目標(biāo)數(shù)組都填該數(shù)組的名稱,然后待復(fù)制的元素大小填寫擴(kuò)大后的長度。下面的代碼便演示了如何將某數(shù)組的大小拉長一位:
?
運(yùn)行調(diào)整數(shù)組大小的演示代碼,觀察到以下的日志輸出:
origin price = 99 origin price = 99 origin price = 99 origin price = 99 origin price = 99 origin price = 0?
由此可見,數(shù)組大小果然增大了一位,并且新增的數(shù)組元素值為0,這正是整型變量的默認(rèn)數(shù)值。
4、Arrays.sort方法
顧名思義,Arrays工具的sort方法是給數(shù)組元素排序的,并且排序結(jié)果為升序。sort方法用起來很簡(jiǎn)單,只要把待排序的數(shù)組名稱填進(jìn)圓括號(hào),編譯器就會(huì)自動(dòng)完成該數(shù)組的排序任務(wù)。舉個(gè)給整型數(shù)組排序的例子,簡(jiǎn)單的Java實(shí)現(xiàn)代碼如下:
?
運(yùn)行上述的排序代碼,得到下面的結(jié)果日志:
origin price = 8 origin price = 18 origin price = 68 origin price = 80 origin price = 99?
從日志看到,排序后的數(shù)組元素從小到大打印,很明顯這是升序排列。
當(dāng)然,在前面的例子中,數(shù)組元素早在聲明數(shù)組時(shí)便初始化賦值了,實(shí)戰(zhàn)性不強(qiáng)。接下來嘗試動(dòng)態(tài)生成一個(gè)隨機(jī)數(shù)數(shù)組,再對(duì)該數(shù)組進(jìn)行排序,這樣更貼近實(shí)際業(yè)務(wù)。詳細(xì)的實(shí)現(xiàn)代碼可能涉及到數(shù)組、循環(huán)、冒號(hào)跳轉(zhuǎn)等技術(shù),有興趣的朋友不妨動(dòng)手實(shí)踐。下面是隨機(jī)數(shù)組生成并排序的代碼例子:
更多Java技術(shù)文章參見《Java開發(fā)筆記(序)章節(jié)目錄》
轉(zhuǎn)載于:https://www.cnblogs.com/pinlantu/p/9955362.html
總結(jié)
以上是生活随笔為你收集整理的Java开发笔记(二十三)数组工具Arrays的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 伐仓清理步骤?
- 下一篇: es6中的类及es5类的实现