歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java程序員的日常—— Arrays工具類的使用

這個類在日常的開發中,還是非常常用的。今天就總結一下Arrays工具類的常用方法。最常用的就是asList,sort,toStream,equals,copyOf了。另外可以深入學習下Arrays的排序算法,這個還是非常有用的。

所有的方法都是在下面的類中進行測試的:

public class ArraysTest {
    String[] array = new String[]{"a","c","2","1","b"};
    Integer[] ints = new Integer[]{5,1,4,3,2};
    ...
}

asList

這個方法可以把數組轉換成List,List提供了很多的操作方法,更便於使用。

    @Test
    public void test1(){
        List<String> lists = Arrays.asList(array);
    }

sort排序和parallelSort並行排序

sort比較常用了,根據元素按照自然排序規則排序,也可以設置排序元素的起始位置。

    @Test
    public void sort(){
       /* Arrays.sort(array);
        for(String str : array){
            System.out.println(str);
        }*/
        Arrays.sort(array,2,5);
        System.out.println(Arrays.deepToString(array));//[a, c, 1, 2, b]
    }

parallelSort則采用並行的排序算法排序.但是我自己測試,可能數據量太小,速度上並沒有明顯的變化。

binarySearch

查找目標元素所在的位置,注意需要先進行排序。

    @Test
    public void binarySearch(){
        //binarySearch需要保證是排好序的
        System.out.println(Arrays.binarySearch(array,"c"));//-6
        Arrays.sort(array);
        System.out.println(Arrays.binarySearch(array,"c"));//4
    }

copyOf

拷貝數組,第一種用法,如果目標長度不夠,會使用0進行補位。第二種用法,支持拷貝目標起始位置到結束為止的數組。

    @Test
    public void copyOf(){
        //如果位數不夠,需要補位
        Integer[] result = Arrays.copyOf(ints,10);
        for(int i : result){
            System.out.println(i);
        }
        System.out.println("----------------------------------------->");
        //如果位數夠,就取最小的數組
        result = Arrays.copyOf(ints,3);
        for(int i : result){
            System.out.println(i);
        }
        System.out.println("----------------------------------------->");
        //
        result = Arrays.copyOfRange(ints,2,4);
        for(int i : result){
            System.out.println(i);
        }
    }

deepEquals深度比較、deepHashCode生成hashcode、deepToString深度打印

這幾個方法基本都是采用遞歸的寫法使用。

    @Test
    public void deepTest(){
        String[] array2 = new String[]{"a","c","2","1","b"};
        System.out.println(Arrays.deepEquals(array,array2));//深度比較兩個數組是否相同

        System.out.println(Arrays.deepHashCode(array));
        System.out.println(Arrays.deepHashCode(array2));//如果兩個數組deepEquals,那麼他們的hashcode一定相同

        //格式化輸出數組
        System.out.println(Arrays.deepToString(array));
    }

equals比較

對比兩個數組是否相等

    @Test
    public void equals(){
        String[] array2 = new String[]{"a","c","2","1","b"};

        //1 對比引用是否相同
        //2 對比是否存在null
        //3 對比長度是否相同
        //4 挨個元素對比
        System.out.println(Arrays.equals(array,array2));
    }

fill

基於目標元素填充數組

    @Test
    public void fill(){
        Arrays.fill(array,"test");
        System.out.println(Arrays.deepToString(array));//[test, test, test, test, test]
    }

toString

打印數組元素

    @Test
    public void string(){
        System.out.println(Arrays.toString(array));//[a, c, 2, 1, b]
    }

toStream

把數組轉換成stream,然後可以使用java8的stream特性了。

    @Test
    public void toStream(){
        Arrays.stream(array).forEach(s-> System.out.println(s));
    }

parallelPrefix

這個有點像spark的reduceByKey,即根據傳入的方法一次計算:

    @Test
    public void parallelPrefix(){
        Arrays.parallelPrefix(ints,(x,y)->(x+y));
        System.out.println(Arrays.deepToString(ints));//[5, 6, 10, 13, 15]
    }

parallelSetAll

這個方法相當於stream.map會挨個元素遍歷執行方法

    @Test
    public void parallelSetAll(){
        Arrays.parallelSetAll(ints,x->x*x);
        System.out.println(Arrays.toString(ints));//[0, 1, 4, 9, 16]
    }

setAll

這個方法與上面類似,只不過不是並行的

    @Test
    public void setAll(){
        Arrays.setAll(ints,x->x*2);
        System.out.println(Arrays.toString(ints));
    }

Copyright © Linux教程網 All Rights Reserved