您当前的位置: 首页 >  Java

Charge8

暂无认证

  • 0浏览

    0关注

    447博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Java 集合工具类--Arrays和Collections

Charge8 发布时间:2019-08-21 19:53:01 ,浏览量:0

一、java.util.Arrays类

        Arrays 类是 JDK 提供的一个工具类,用来处理数组的各种方法,而且每个方法基本上都是静态方法,能直接通过类名Arrays调用。

1、Array类与Arrays类的区别?

      Array类提供了提供静态方法,把数组作为Object来动态创建和访问 Java数组的方法。

      Arrays类包含用于操作数组的各种方法(通过index索引),如排序、搜索等。 该类还包含一个静态工厂,可以将数组视为List。

2、Arrays类的常用方法

     只整理了某一种重载的常用方法,具体查看API

1)将数组转换为集合

    • static  ListasList(T... a)

      返回由指定数组支持的固定大小的列表。

注意:

  (1)该方法不适用于基本数据类型(byte,short,int,long,float,double,boolean)

    public static void main(String[] args) throws UnsupportedEncodingException {
        int[] ints = { 1, 2, 3 };
        List list = Arrays.asList(ints);
        System.out.println("长度:" + list.size() + ";元素:" + list); //长度:1;元素:[[I@1c20c684]

        Integer[] ints2 = { 1, 2, 3, 4, 5 };
        List list2 = Arrays.asList(ints2);
        System.out.println("长度:" + list2.size() + ";元素:" + list2); //长度:5;元素:[1, 2, 3, 4, 5]
    }

  asList 方法接受的参数是一个泛型的变长参数,我们知道基本数据类型是无法泛型化的,也就是说8个基本类型是无法作为asList方法的参数的, 要想作为泛型参数就必须使用其所对应的包装类型。但是这个实例中为什么没有出错呢?因为该实例是将int 类型的数组当做其参数,而在Java中数组是一个对象,它是可以泛型化的。所以该例子是不会产生错误的。既然例子是将整个int 类型的数组当做泛型参数,那么经过asList转换就只有一个int 的列表了。

       结论:在使用asList()时尽量不要将基本数据类型数组转List。

       (2)该方法将数组与列表链接起来,当更新其中之一时,另一个自动更新。

    public static void main(String[] args) throws UnsupportedEncodingException {
        String[] arr = {"a","java","array"};
        List list = Arrays.asList(arr);
        arr[0] = "edit-a";
        list.set(2,"edit-java");
        System.out.println(Arrays.toString(arr)); //[edit-a, java, edit-java]
        System.out.println(list.toString()); //[edit-a, java, edit-java]
    }

  (3)不支持add和remove方法

    public static void main(String[] args){
        String[] arr = {"a","java","array"};
        List list = Arrays.asList(arr);
        list.add("add"); // 运行报错:java.lang.UnsupportedOperationException
        list.remove(arr[0]);
    }

         

通过asList()源码可发现:

        Arrays.ArrayList 是工具类 Arrays 的一个内部静态类,它没有完全实现List的方法,而 ArrayList直接实现了List 接口,实现了List所有方法。

        Arrays.ArrayList将外部数组的引用直接通过“=”赋予内部的泛型数组,所以本质指向同一个数组。

Arrays.asList() 方法使用场景:

  Arrays工具类提供了一个方法asList, 使用该方法可以将一个变长参数或者数组转换成List 。但是,生成的List的长度是固定的;能够进行修改操作(比如,修改某个位置的元素);不能执行影响长度的操作(如add、remove等操作),否则会抛出UnsupportedOperationException异常。

       所以 Arrays.asList 比较适合那些已经有数组数据或者一些元素,而需要快速构建一个List,只用于读取操作,而不进行添加或删除操作的场景。

2)拷贝数组

      其内部调用了 System.arraycopy() 方法,从下标 0 开始,如果超过原数组长度,则会用 null 进行填充。

    • static  T[]copyOf(T[] original, int newLength)

      复制指定的数组,用空值截断或填充(如有必要),以便复制具有指定的长度。

      static  T[]copyOfRange(T[] original, int from, int to)

      将指定数组的指定范围复制到新数组中。

    public static void main(String[] args){
        String[] arr = {"a","java","array","b"};
        String[] arr1 = Arrays.copyOf(arr, 2); //[a, java]
        String[] arr2 = Arrays.copyOf(arr, 5); //[a, java, array, b, null]
        
        String[] arr3 = Arrays.copyOfRange(arr,1,3); //[java, array]
        String[] arr4 = Arrays.copyOfRange(arr,2,5); //[array, b, null]
    }

3)判断两个数组是否相等

     判断两个(多维)数组是否相等       

数组元素为基本数据类型时,依次比较值

数组元素为引用数据类型时,依次调用元素的 equals() 方法进行比较

即如果两个(多维)数组被认为是相等的,则两个(多维)数组中应包含相同顺序的相同元素
    public static void main(String[] args){
        Integer[] data1 = {1, 2, 3};
        Integer[] data2 = {1, 3, 2};
        System.out.println(Arrays.equals(data1, data2)); // false

        Integer[][] data3 = {{1,2,3}, {1,2,3}};
        Integer[][] data4 = {{1,2,3}, {1,2,3}};
        System.out.println(Arrays.deepEquals(data3, data4)); // true
    }

4)获取数组的哈希值

    • static inthashCode(Object[] a)

      根据指定数组的内容返回哈希码。

      static intdeepHashCode(Object[] a)

      根据指定数组的“深度内容”返回哈希码。

5)获取数组元素的字符串形式

    • static StringtoString(Object[] a)

      返回指定数组的内容的字符串表示形式。

      static StringdeepToString(Object[] a)

      返回指定数组的“深度内容”的字符串表示形式。

    public static void main(String[] args){
        Integer[] data1 = {1, 2, 3};
        Integer[][] data2 = {{1,2,3}, {1,2,3}};
        //哈希值
        System.out.println(Arrays.hashCode(data1)); //30817
        System.out.println(Arrays.deepHashCode(data2)); //987105
        //字符串形式
        System.out.println(Arrays.toString(data1)); //[1, 2, 3]
        System.out.println(Arrays.deepToString(data2)); //[[1, 2, 3], [1, 2, 3]]
    }

6)数组的排序

    • static voidsort(int[] a)

      按照数字顺序排列指定的数组。

      static voidsort(Object[] a)

      对指定对象升序排列的阵列,根据natural ordering的元素。

      static  voidsort(T[] a, Comparator list, int i, int j)

      交换指定列表中指定位置的元素。

      static voidreverse(List list)

      反转指定列表中元素的顺序。

      static voidshuffle(List list)

      使用默认的随机源随机排列指定的列表。

    public static void main(String[] args){
        List list = Arrays.asList("one two three four five six siven".split(" "));
        Collections.sort(list);
        System.out.println(list.toString()); //[five, four, one, siven, six, three, two]
        Collections.reverse(list);
        System.out.println(list.toString()); //[two, three, six, siven, one, four, five]
    }

2)查找、替换操作

    • static  intbinarySearch(List c, Object o)

      返回指定集合中与指定对象相等的元素数。

      static intindexOfSubList(List source, List target)

      返回指定源列表中指定目标列表的第一次出现的起始位置,如果没有此类事件,则返回-1。

      static intlastIndexOfSubList(List source, List target)

      返回指定源列表中指定目标列表的最后一次出现的起始位置,如果没有此类事件则返回-1。

      static
关注
打赏
1664721914
查看更多评论
0.0377s