1.8 Arrays工具类
Arrays 類是一個工具類,其中包含了數組操作的很多方法。這個 Arrays 類里均為 static 修飾的方法(static 修飾的方法可以直接通過類名調用),可以直接通過 Arrays.xxx(xxx) 的形式調用方法。
索引查找
1)int binarySearch(type[] a, type key)
使用二分法查詢 key 元素值在 a 數組中出現的索引,如果 a 數組不包含 key 元素值,則返回負數。調用該方法時要求數組中元素己經按升序排列,這樣才能得到正確結果。
2)int binarySearch(type[] a, int fromIndex, int toIndex, type key)
這個方法與前一個方法類似,但它只搜索 a 數組中 fromIndex 到 toIndex 索引的元素。調用該方法時要求數組中元素己經按升序排列,這樣才能得到正確結果。
復制數組
3)type[] copyOf(type[] original, int length)
這個方法將會把 original 數組復制成一個新數組,其中 length 是新數組的長度。如果 length 小于 original 數組的長度,則新數組就是原數組的前面 length 個元素,如果 length 大于 original 數組的長度,則新數組的前面元索就是原數組的所有元素,后面補充 0(數值類型)、false(布爾類型)或者 null(引用類型)。
4)type[] copyOfRange(type[] original, int from, int to)
這個方法與前面方法相似,但這個方法只復制 original 數組的 from 索引到 to 索引的元素。
比較
5)boolean equals(type[] a, type[] a2)
如果 a 數組和 a2 數組的長度相等,而且 a 數組和 a2 數組的數組元素也一一相同,該方法將返回 true。
賦值
6)void fill(type[] a, type val)
該方法將會把 a 數組的所有元素都賦值為 val。
7)void fill(type[] a, int fromIndex, int toIndex, type val)
該方法與前一個方法的作用相同,區別只是該方法僅僅將 a 數組的 fromIndex 到 toIndex 索引的數組元素賦值為 val。
排序
8)void sort(type[] a)
該方法對 a 數組的數組元素進行排序。
9)void sort(type[] a, int fromIndex, int toIndex)
該方法與前一個方法相似,區別是該方法僅僅對 fromIndex 到 toIndex 索引的元素進行排序。
轉換
10)String toString(type[] a)
該方法將一個數組轉換成一個字符串。該方法按順序把多個數組元素連綴在一起,多個數組元素使用英文逗號,和空格隔開。
下面程序示范了 Arrays 類的用法。
public class ArraysTest {public static void main(String[] args) {// 定義一個a數組int[] a = new int[] { 3, 4, 5, 6 };// 定義一個a2數組int[] a2 = new int[] { 3, 4, 5, 6 };// a數組和a2數組的長度相等,毎個元素依次相等,將輸出trueSystem.out.println("a數組和a2數組是否相等:" + Arrays.equals(a, a2));// 通過復制a數組,生成一個新的b數組int[] b = Arrays.copyOf(a, 6);System.out.println("a數組和b數組是否相等:" + Arrays.equals(a, b));// 輸出b數組的元素,將輸出[3, 4, 5, 6, 0, 0]System.out.println("b 數組的元素為:" + Arrays.toString(b));// 將b數組的第3個元素(包括)到第5個元素(不包括)賦值為1Arrays.fill(b, 2, 4, 1);// 輸出b數組的元素,將輸出[3, 4, 1, 1, 0, 0]System.out.println("b 數組的元素為:" + Arrays.toString(b));// 對b數組進行排序Arrays.sort(b);// 輸出b數組的元素.將輸出[0,0,1,1,3,4]System.out.println("b數組的元素為:" + Arrays.toString(b));} }Arrays 類處于 java.util 包下,為了在程序中使用 Arrays 類,必須在程序中導入 java.util.Arrays 類。
除此之外,在 System 類里也包含了一個static void arraycopy(Object src, int srePos, Object dest, int dcstPos, int length)方法,該方法可以將 src 數組里的元素值賦給 dest 數組的元素,其中 srcPos 指定從 src 數組的第幾個元素開始賦值,length 參數指定將 src 數組的多少個元素值賦給 dest 數組的元素。
Java 8 增強了 Arrays 類的功能,為 Arrays 類增加了一些工具方法,這些工具方法可以充分利用多 CPU 并行的能力來提高設值、排序的性能。下面是 Java 8 為 Arrays 類增加的工具方法。
提示:由于計算機硬件的飛速發展,目前幾乎所有家用 PC 都是 4 核、8 核的 CPU,而服務器的 CPU 則具有更好的性能,因此 Java 8 與時俱進地增加了并發支持,并發支持可以充分利用硬件設備來提高程序的運行性能。
1)oid parallelPrefix(xxx[] array, XxxBinaryOperator op)
該方法使用 op 參數指定的計算公式計算得到的結果作為新的元素。op 計算公式包括 left、right 兩個形參,其中 left 代表數組中前一個索引處的元素,right 代表數組中當前索引處的元素,當計算第一個新數組元素時,left 的值默認為 1。
2)void parallelPrefix(xxx[] array, int fromIndex, int toIndex, XxxBinaryOperator op)
該方法與上一個方法相似,區別是該方法僅重新計算 fromIndex 到 toIndex 索引的元素。
3)void setAll(xxx[] array, IntToXxxFunction generator)
該方法使用指定的生成器(generator)為所有數組元素設置值,該生成器控制數組元素的值的生成算法。
4)void parallelSetAll(xxx[] array, IntToXxxFunction generator)
該方法的功能與上一個方法相同,只是該方法增加了并行能力,可以利用多 CPU 并行來提高性能。
5)void parallelSort(xxx[] a)
該方法的功能與 Arrays 類以前就有的 sort() 方法相似,只是該方法增加了并行能力,可以利用多 CPU 并行來提高性能。
6)void parallelSort(xxx[] a,int fromIndex, int toIndex)
該方法與上一個方法相似,區別是該方法僅對 fromIndex 到 toIndex 索引的元素進行排序。
7)Spliterator.OfXxx spliterator(xxx[] array)
將該數組的所有元素轉換成對應的 Spliterator 對象。
8)Spliterator.OfXxx spliterator(xxx[] array, int startInclusive, int endExclusive)
該方法與上一個方法相似,區別是該方法僅轉換 startInclusive 到 endExclusive 索引的元素。
9)XxxStream stream(xxx[] array)
該方法將數組轉換為 Stream,Stream 是 Java 8 新增的流式編程的 API。
10)XxxStream stream(xxx[] array, int startInclusive, int endExclusive)
該方法與上一個方法相似,區別是該方法僅將 fromIndex 到 toIndex 索引的元索轉換為 Stream。
上面方法列表中,所有以 parallel 開頭的方法都表示該方法可利用 CPU 并行的能力來提高性能。上面方法中的 xxx 代表不同的數據類型,比如處理 int[] 型數組時應將 xxx 換成 int,處理 long[] 型數組時應將 XXX 換成 long。
下面程序示范了 Java 8 為 Arrays 類新增的方法。
下面程序用到了接口、匿名內部類的知識,讀者閱讀起來可能有一定的困難,此處只要大致知道 Arrays 新增的這些新方法就行,暫時并不需要讀者立即掌握該程序,可以等到掌握了接口、匿名內部類后再來學習下面程序。
public class ArraysTest2 {public static void main(String[] args) {int[] arr1 = new int[] { 3, 4, 25, 16, 30, 18 };// 對數組arr1進行并發排序Arrays.parallelSort(arr1);System.out.println(Arrays.toString(arr1));int[] arr2 = new int[] { 13, -4, 25, 16, 30, 18 };Arrays.parallelPrefix(arr2, new IntBinaryOperator() {// left 代表數組中前一個索引處的元素,計算第一個元素時,left為1// right代表數組中當前索引處的元素public int applyAsInt(int left, int right) {return left * right;}});System.out.println(Arrays.toString(arr2));int[] arr3 = new int[5];Arrays.parallelSetAll(arr3, new IntUnaryOperator() {// operand代表正在計算的元素索引public int applyAsInt(int operand) {return operand * 5;}});System.out.println(Arrays.toString(arr3));} }上面程序中第一行粗體字代碼調用了 parallelSort() 方法對數組執行排序,該方法的功能與傳統 sort() 方法大致相似,只是在多 CPU 機器上會有更好的性能。
第二段粗體字代碼使用的計算公式為 left * right,其中 left 代表數組中當前一個索引處的元素,right 代表數組中當前索引處的元素。程序使用的數組為:
{3, -4 , 25, 16, 30, 18)計算新的數組元素的方式為:
{1*3=3, 3*-4—12, -12*25=-300, -300*16=—48000, -48000*30=—144000, -144000*18=-2592000}因此將會得到如下新的數組元素:
{3, -12, -300, -4800, -144000, -2592000)第三段粗體字代碼使用 operand * 5 公式來設置數組元素,該公式中 operand 代表正在計算的數組元素的索引。因此第三段粗體字代碼計算得到的數組為:
{0, 5, 10, 15, 20}提示:上面兩段粗體字代碼都可以使用 Lambda 表達式進行簡化。
總結
以上是生活随笔為你收集整理的1.8 Arrays工具类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.7 Java到底有没有多维数组?
- 下一篇: 1.9 Java数组和字符串的相互转换