java.util.Arrays的用法(一)

java.util.Arrays是JDK1.2版本开始引入的,用来提供操作数组(比如排序和搜索)的各种方法。此类还包含一个允许将数组作为列表来查看的静态工厂,下面整理几个常用方法:

  • sort

    Arrays类中的sort()常用于对集合进行各种排序(顺序、倒序、基于策略排序等),对于基础数据类型,如int、float、long ,Arrays只提供默认的升序排序,那如果我们要实现倒序或者基于策略的排序要怎么做呢?可以通过实现Comparable接口或者具有相关联的Comparator即可,下面示例演示通过实现Comparator进行倒序排序(其实java.util.Collections类中已经有了倒序的comparator):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    @Test
    public void sort(){
    int[] array = {7,8,3,2,12,6};
    Arrays.sort(array, 1 , 3);
    //输出 [7, 3, 8, 2, 12, 6]
    System.out.println("基础数据部分排序(顺序):" + Arrays.toString(array));
    Arrays.sort(array);
    //输出[2, 3, 6, 7, 8, 12]
    System.out.println("基础数据整体排序(顺序):" + Arrays.toString(array));
    Integer[] array2 = {7,8,3,2,12,6};
    Arrays.sort(array2, new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
    //return o1 < o2 ? 1 : (o1 == o2 ? 0 : -1);
    return o2 - o1; // 倒序:o2 - o1 顺序:o1 - o2
    }
    });
    //使用java.util.Collections的倒序comparator
    //Arrays.sort(array2,Collections.reverseOrder());
    //输出[12, 8, 7, 6, 3, 2]
    System.out.println("复合数据整体排序(倒序):" + Arrays.toString(array2));
    }

    对于基础类型,java.util.Arrays.sort()使用的是“经过调优的快速排序法”,而针对对象,使用的是“经过调优的稳定归并排序法”,所以一般情况下,我们不用担心排序的性能问题。

  • binarySearch

    使用二分搜索法来查找指定元素的位置,需要注意的是调用该方法时需要先进行sort排序,返回的位置也是数组排序后的位置,且如果数组包含多个带有指定值的元素,则无法保证找到的是哪一个。另:如果使用了Comparator排序了,在调用binarySearch方法时需要增加一个Comparator参数:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @Test
    public void binarySearch(){
    int[] array = {7,8,3,2,12,6};
    Arrays.sort(array);
    //排序后,2属于第一个位置,所以输出 0
    System.out.println("指定元素位置:" + Arrays.binarySearch(array, 2));
    Integer[] array2 = {7,8,3,2,12,6};
    Arrays.sort(array2, Collections.reverseOrder());
    //使用Collections.reverseOrder()排序后,binarySearch方法也需要添加 Collections.reverseOrder()参数,输出 5
    System.out.println("指定元素位置:" + Arrays.binarySearch(array2, 2, Collections.reverseOrder()));
    }
  • asList

    asList可以将一个可变参数列表,或一个数组转变成一个固定长度的List,但在使用基础类型数据过程中要注意“陷进”:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public void asList(){
    int[] array = {7,8,3,2,12,6};
    int i = 12;
    //输出1 ,因为int[] 本身就是一个类型,所以a变量作为参数传递时,编译器认为只传了一个变量,
    //这个变量的类型是int数组,所以size为1
    System.out.println(Arrays.asList(array).size());
    //输出false,原因同上,contains采用的是equals方法,12和int[]equals为false
    System.out.println(Arrays.asList(array).contains(i));
    Integer[] array2 = {7,8,3,2,12,6};
    //输出6
    System.out.println(Arrays.asList(array2).size());
    //输出true
    System.out.println(Arrays.asList(array2).contains(i));
    }

下期介绍fill、copyOf、deepEquals方法。

坚持原创技术分享,您的支持将鼓励我继续创作!
分享