Java中Arrays數組工具類的基本使用詳解

方法一覽表

方法名 簡要描述
asList() 返回由指定數組支持的固定大小的列表。
sort() 將數組排序(升序)
parallelSort() 將指定的數組按升序排序
binarySearch() 使用二分搜索法快速查找指定的值(前提是數組必須是有序的)
compare() 按字典順序比較兩個數組
compareUnsigned() 按字典順序比較兩個數組,將數字元素處理為無符號
copyOf() 填充復制數組
copyOfRange() 將數組的指定范圍復制到新數組
equals() 比較兩個數組
deepEquals() 比較兩個數組深度
toString() 將數組轉換為字符串
deepToString() 將一個多維數組轉換為字符串
fill() 將指定元素填充給數組每一個元素
mismatch() 查找並返回兩個數組之間第一個不匹配的索引,如果未找到則返回-1
parallelPrefix() 使用提供的函數對數組元素進行操作
parallelSetAll() 使用提供的生成器函數並行設置指定數組的所有元素以計算每個元素
setAll() 使用提供的生成器函數設置指定數組的所有元素以計算每個元素

快速定位詳細操作

接下來我用代碼一一舉例演示。

asList()

功能:返回由指定數組支持的固定大小的列表

參數:asList​(T… a)

返回值:一個列表

代碼示例

    @Test
    public void asListTest() {
        List<String> ss = Arrays.asList("hello", "world");
//        List<String> ss1 = Arrays.asList("hello", "world",1);   報錯,類型必須一直(泛型)
        System.out.println(ss);  //[hello, world]
        
//        ss.add("java");  //UnsupportedOperationException  會報錯
//        ss.remove(1);   //UnsupportedOperationException  會報錯
        
        System.out.println(ss.get(0));  //hello
        ss.set(0, "java");
        System.out.println(ss);  //[java, world]

    }

註意

將這一數組轉換為列表後,對應的列表是不支持添加和刪除操作的,否則會報錯
但可以修改和獲取元素

toString() 和 deepToString()

功能:將數組轉換為字符串

參數:待轉化數組

返回值:轉化後的字符串

代碼示例

    @Test
    public void asListTest() {
        List<String> ss = Arrays.asList("hello", "world");
//        List<String> ss1 = Arrays.asList("hello", "world",1);   報錯,類型必須一直(泛型)
        System.out.println(ss);  //[hello, world]
        
//        ss.add("java");  //UnsupportedOperationException  會報錯
//        ss.remove(1);   //UnsupportedOperationException  會報錯
        
        System.out.println(ss.get(0));  //hello
        ss.set(0, "java");
        System.out.println(ss);  //[java, world]

    }

sort() 和 parallelSort()

功能:都是將數組排序(默認升序,支持lambda,泛型)
參數

  • sort​(Object[] a[, int fromIndex, int toIndex])
  • 或者sort​(T[] a[, int fromIndex, int toIndex,] Comparator<? super T> c)
  • parallelSort(Object[] a[, int fromIndex, int toIndex])
  • 或者parallelSort​(T[] a[, int fromIndex, int toIndex,] Comparator<?
    super T> c)

返回值:無

代碼示例

    @Test
    public void sortTest() {
        String[] str = {"abc", "add", "java", "hello", "javascript"};
        int[] ii = {1, 8, 99, 222, 35};

        System.out.println(Arrays.toString(str));
        System.out.println(Arrays.toString(ii));

        //單參數情況
        //Arrays.sort(str);  默認全排,字母會按照字母表順序
        //Arrays.sort(ii);
        //System.out.println(Arrays.toString(str));  //[abc, add, hello, java, javascript]
        //System.out.println(Arrays.toString(ii));  //[1, 8, 35, 99, 222]

        //多參數情況
        //Arrays.sort(str,2,4);   隻排列指定范圍內的
        //Arrays.sort(ii,2,4);
        //System.out.println(Arrays.toString(str));  //[abc, add, hello, java, javascript]
        //System.out.println(Arrays.toString(ii));  //[1, 8, 99, 222, 35]

        //可傳入lambda表達式(多參數情況可指定開始結束位置)
//        Arrays.sort(str, (a, b) -> b.compareTo(a));  //降序
//        System.out.println(Arrays.toString(str));  //[javascript, java, hello, add, abc]


        //parallelSort()方法目前我實驗感覺與sort()相差無幾,基本相似
        Arrays.parallelSort(str);
        System.out.println(Arrays.toString(str));  //[abc, add, hello, java, javascript]

        Arrays.parallelSort(str,(a,b)->b.compareTo(a));
        System.out.println(Arrays.toString(str));  //[javascript, java, hello, add, abc]
    }

binarySearch()

功能:使用二分搜索法快速查找指定的值(前提是數組必須是有序的,支持lambda表達式,泛型)
參數:binarySearch​(Object[] a[, int fromIndex, int toIndex], Object key)

返回值:有則返回對應下標,無則返回負值

代碼示例

    @Test
    public void binarySearchTest() {
        int[] a = {1, 5, 7, 4, 6, 7, 8, 4, 9, 0};
        Arrays.sort(a);  //必須先排序
        System.out.println(Arrays.toString(a));
        //[0, 1, 4, 4, 5, 6, 7, 7, 8, 9]
        System.out.println(Arrays.binarySearch(a, 4));  //2
        System.out.println(Arrays.binarySearch(a, 11));  //-11
        //也可指定范圍查找,其查找機制是折半查找,每次縮小一半范圍
    }

compare() 和 compareUnsigned()

功能:按字典順序比較兩個數組

參數

compare​(T[] a, 【int aFromIndex, int aToIndex】, T[] b,【 int bFromIndex, int bToIndex】,【 Comparator<? super T> cmp】)

返回值

  • 如果第一個和第二個數組相等並且包含相同順序的相同元素,則值為0 ;
  • 如果第一個數組按字典順序小於第二個數組,則值小於0 ;
  • 如果第一個數組按字典順序大於第二個數組,則值大於0

代碼示例

    @Test
    public void compareTest() {
        int[] a = {1, 2, 3, 4};
        int[] b = {1, 2, 3, 4, 5};
        int[] c = {1, 2, 3, 4, 5};
        String[] s1 = {"java","hello","c++"};
        String[] s2 = {"java","hello"};

//        System.out.println(Arrays.compare(a,b));  //-1
//        System.out.println(Arrays.compare(b,a));  //1
//        System.out.println(Arrays.compare(b,c));  //0

        System.out.println(Arrays.compare(s1,s2));  //1
        //也可劃定范圍去比較,或者傳入lambda



//        System.out.println(Arrays.compareUnsigned(s1,s2));//報錯
        System.out.println(Arrays.compareUnsigned(a,b));  //-1
    }

註意

compareUnsigned()隻能比較byte(),short(),int(),long()數字型數組,可以劃定比較范圍,但不支持lambda

copyOf() 和 copyOfRange()

功能:復制填充數組

參數

  • copyOf​(int[] original, int newLength)…
  • copyOf​(T[] original, int newLength)
  • copyOfRange​(int[] original, int from, int to)…
  • copyOfRange​(T[] original, int from, int to)
  • copyOfRange​(U[] original, int from, int to, 類<? extends T[]> newType)

返回值:復制填充後的數組

代碼示例

    @Test
    public void copyOfTest() {

        //copyOf

        int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
        int[] arr1 = Arrays.copyOf(arr, 5);  //拷貝長度為5,第二個參數為新數組的長度
        int[] arr2 = Arrays.copyOf(arr, 15);
        System.out.println(Arrays.toString(arr1));  //[1, 2, 3, 4, 5]
        System.out.println(Arrays.toString(arr2));  //[1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0]

        arr[0] = 20;   //改變原數組
        System.out.println(Arrays.toString(arr));     //原數組改變
        System.out.println(Arrays.toString(arr1));   //復制後的數組不變

        String[] str = {"java","hello","world"};
        String[] str1 = Arrays.copyOf(str,2);
        String[] str2 = Arrays.copyOf(str,5);
        System.out.println(Arrays.toString(str1));  //[java, hello]
        System.out.println(Arrays.toString(str2));  //[java, hello, world, null, null]




        //copyOfRange()

        int[] arrs = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
        int[] arr3 = Arrays.copyOfRange(arrs,2,8);   //[3, 4, 5, 6, 7, 8]
        int[] arr4 = Arrays.copyOfRange(arrs,5,15);  //[6, 7, 8, 9, 0, 0, 0, 0, 0, 0]
        System.out.println(Arrays.toString(arr3));
        System.out.println(Arrays.toString(arr4));
        arrs[6] = 99;  //改變原數組
        System.out.println(Arrays.toString(arrs));   //[1, 2, 3, 4, 5, 6, 99, 8, 9, 0]  原數組改變
        System.out.println(Arrays.toString(arr3));   //[3, 4, 5, 6, 7, 8]  復制後的不會隨著改變

    }

註意

copyOf()是從原數組0位置開始拷貝指定長度到新數組
copyOfRange()是從原數組中指定范圍拷貝到新數組
如果指定長度或者范圍超出原數組范圍,則超出部分會補上此數據類型的默認值,如String類型會補null,int型會補0

equals()

功能:比較兩個數組

參數

  • equals​(int[] a,【 int aFromIndex, int aToIndex】, int[] b,【 int bFromIndex, int bToIndex】)…
  • equals​(T[] a, 【int aFromIndex, int aToIndex】, T[] b,【 int bFromIndex, int bToIndex】, Comparator<? super T> cmp)

返回值:boolean

代碼示例

@Test
    public void equalsTest() {
        int[] a = {1, 2, 3, 4, 5, 6};
        int[] b = {6, 5, 3, 4, 2, 1};

        System.out.println(Arrays.equals(a, b));   //false
        System.out.println(Arrays.equals(a, 2, 3, b, 2, 3));  //指定比較范圍  true
    }

deepEquals()

功能:比較兩個數組的深度

參數:deepEquals​(Object[] a1, Object[] a2)

返回值:boolean

代碼示例

    @Test
    public void deepEqualsTest() {
        String[] s1 = {"java", "hello", "c++"};
        String[] s2 = {"java", "hello"};
        String[] s3 = {"java", "hello", "c++"};
        System.out.println(Arrays.deepEquals(s1, s2));  //false
        System.out.println(Arrays.deepEquals(s1, s3));  //true

        String[][] s4 = {{"hello"}, {"java"}, {"c++"}, {"python"}};
        String[][] s5 = {{"hello"}, {"java"}, {"c++"}, {"python"}};
        System.out.println(Arrays.deepEquals(s4, s5));  //true
        System.out.println(Arrays.equals(s4, s5));    //false
        
        int[] a = {1,2};
        int[] b = {1,2};
//        System.out.println(Arrays.deepEquals(a,b));  //報錯
        
    }

比較equals()deepEquals()方法

相同點

兩者都是比較數組是否相等的方法

不同點

  • equals默認從頭比較到尾,也可以指定范圍,但是deepEquals不能指定范圍
  • 可以比較多維數組,equals不能
  • deepEquals不支持比較基本類型數組,equals支持

 fill()

功能:將指定元素填充給數組每一個元素

參數:fill​(int[] a, 【int fromIndex, int toIndex】, int val)

返回值:無

代碼示例

    @Test
    public void fillTest() {
        String[] a = {"a", "b", "c", "d", "e", "f"};
        System.out.println(Arrays.toString(a));  //[a, b, c, d, e, f]
        Arrays.fill(a, "java");
        System.out.println(Arrays.toString(a));  //[java, java, java, java, java, java]

        String[] b = {"a", "b", "c", "d", "e", "f"};
        System.out.println(Arrays.toString(b));  //[a, b, c, d, e, f]
        Arrays.fill(b, 2, 5, "java");
        System.out.println(Arrays.toString(b));  //[a, b, java, java, java, f]
        
        //默認全填充,也可以指定范圍,會改變原數組
    }

mismatch()

功能:查找並返回兩個數組之間第一個不匹配的索引,如果未找到則返回-1
參數

  • mismatch​(int[] a, 【int aFromIndex, int aToIndex】, int[] b,【 int bFromIndex, int bToIndex】)
  • mismatch​(T[] a, 【int aFromIndex, int aToIndex】, T[] b,【 int bFromIndex, int bToIndex】, Comparator<? super T> cmp)

返回值:兩個數組之間第一個不匹配的索引,未找到不匹配則返回-1。

代碼示例

    @Test
    public void mismatchTest() {
        String[] s1 = {"java", "c++", "html", "css", "Javascript", "world"};
        String[] s2 = {"world", "c++", "html", "css", "Javascript"};
        System.out.println(Arrays.mismatch(s1, s2)); //0
        System.out.println(Arrays.mismatch(s1, 1, 4, s2, 1, 4));  //-1
        System.out.println(Arrays.mismatch(s1, 1, 5, s2, 1, 4));  //3

    }

parallelPrefix()

功能:使用提供的函數並行地累積給定數組的每個元素。
參數

  • parallelPrefix​(int[] array, 【int fromIndex, int toIndex】, IntBinaryOperator op)
  • parallelPrefix​(T[] array, 【int fromIndex, int toIndex】, BinaryOperator op)

返回值:無

代碼示例

 @Test
    public void parallelPrefixTest() {
        String[] s1 = {"java", "c++", "html", "css", "Javascript", "world"};
        System.out.println(Arrays.toString(s1));   //[java, c++, html, css, Javascript, world]
        Arrays.parallelPrefix(s1, String::concat);
        System.out.println(Arrays.toString(s1));   //[java, javac++, javac++html, javac++htmlcss, javac++htmlcssJavascript, javac++htmlcssJavascriptworld]

        int[] a = {1, 2, 3, 4, 5};
        System.out.println(Arrays.toString(a));  //[1, 2, 3, 4, 5]
        Arrays.parallelPrefix(a, (x, y) -> x * y);
        System.out.println(Arrays.toString(a));  //[1, 2, 6, 24, 120]
        Arrays.parallelPrefix(a, 2, 4, (x, y) -> x / y);
        System.out.println(Arrays.toString(a));  //[1, 2, 6, 0, 120]  也可指定范圍
    }

setAll() 和 parallelSetAll()

功能:使用提供的生成器函數設置指定數組的所有元素以計算每個元素。
參數

  • parallelSetAll​(T[] array, IntFunction<? extends T> generator)
  • setAll​(T[] array, IntFunction<? extends T> generator)

返回值:無

代碼示例

 @Test
    public void parallelPrefixTest() {
        String[] s1 = {"java", "c++", "html", "css", "Javascript", "world"};
        System.out.println(Arrays.toString(s1));   //[java, c++, html, css, Javascript, world]
        Arrays.parallelPrefix(s1, String::concat);
        System.out.println(Arrays.toString(s1));   //[java, javac++, javac++html, javac++htmlcss, javac++htmlcssJavascript, javac++htmlcssJavascriptworld]

        int[] a = {1, 2, 3, 4, 5};
        System.out.println(Arrays.toString(a));  //[1, 2, 3, 4, 5]
        Arrays.parallelPrefix(a, (x, y) -> x * y);
        System.out.println(Arrays.toString(a));  //[1, 2, 6, 24, 120]
        Arrays.parallelPrefix(a, 2, 4, (x, y) -> x / y);
        System.out.println(Arrays.toString(a));  //[1, 2, 6, 0, 120]  也可指定范圍
    }

本文大致包含瞭所有的方法,除瞭Java 11之後新增的,或者我看漏的,文中如有錯誤,還請指出,大傢一起進步!

總結

到此這篇關於Java中Arrays數組工具類的基本使用的文章就介紹到這瞭,更多相關Java Arrays數組工具類使用內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: