zoukankan      html  css  js  c++  java
  • 【JAVA】【集合3】Java中的Arrays工具类

    【集合】Arrays工具类

    一、Arrays定义

    java.util.Arrays是一个包装类,它包含了各种 数组操作静态多态方法。此类 不能实例化,就像一个 工具类,服务于Java中的数组。

    其定义:

    public class Arrays {
         ....
    }
    

    二、Arrays常用静态方法

    1. 数组排序

    (1)int[] 数组升序排序

    public static void sort(int[] a)
    

    (2)int[]数组指定范围 升序排序

    排序范围是从元素下标为fromIndex,到下标为toIndex-1的元素进行排序。

    public static void sort(int[] a, int fromIndex, int toIndex)
    

    2.其他基础类型的数组排序

    public static void sort(char[] a)
    public static void sort(char[] a, int fromIndex, int toIndex)
    
    public static void sort(byte[] a)
    public static void sort(byte[] a, int fromIndex, int toIndex)
    
    public static void sort(short[] a)
    public static void sort(short[] a, int fromIndex, int toIndex)
    
    public static void sort(long[] a)
    public static void sort(long[] a, int fromIndex, int toIndex) 
    
    public static void sort(float[] a)
    public static void sort(float[] a, int fromIndex, int toIndex)
    
    public static void sort(double[] a)
    public static void sort(double[] a, int fromIndex, int toIndex)
    

    3. 指定排序算法进行排序

    public static <T> void sort(T[] a, Comparator<? super T> c) {
        if (c == null) {
            sort(a);
        } else {
            if (LegacyMergeSort.userRequested)
                legacyMergeSort(a, c);
            else
                TimSort.sort(a, 0, a.length, c, null, 0, 0);
        }
    }
    
    public interface Comparator<T> {
        //a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second.
        int compare(T o1, T o2);
    }
    

    使用:

    public int xxxxx(int[] A) {
        int N = A.length;
        Integer[] B = new Integer[N];
        for (int i = 0; i < N; ++i)
            B[i] = i;
        
        //把B中保存的i,按照i对应的A中的值排升序
        Arrays.sort(B, (i, j) -> ((Integer) A[i]).compareTo(A[j]));
        ...
    }
    

    4. Java 8新增的并行排序

    java8新增的并行排序算法,基于fork/join框架。

    public static void parallelSort(char[] a)
    public static void parallelSort(char[] a, int fromIndex, int toIndex)
    
    public static void parallelSort(byte[] a) 
    public static void parallelSort(byte[] a, int fromIndex, int toIndex)
    
    public static void parallelSort(short[] a)
    public static void parallelSort(short[] a, int fromIndex, int toIndex)
    
    public static void parallelSort(int[] a) 
    public static void parallelSort(int[] a, int fromIndex, int toIndex) 
    
    public static void parallelSort(long[] a) 
    public static void parallelSort(long[] a, int fromIndex, int toIndex) 
    
    public static void parallelSort(float[] a) 
    public static void parallelSort(float[] a, int fromIndex, int toIndex)
    
    public static void parallelSort(double[] a) 
    public static void parallelSort(double[] a, int fromIndex, int toIndex) 
    

    5.数组中所有字段填充为指定值

    以填充int[]类型数组为为例,其实现方法为:

    public static void fill(int[] a, int val) {
        for (int i = 0, len = a.length; i < len; i++)
            a[i] = val;
    }
    

    其他类似的填充方法:

    public static void fill(boolean[] a, boolean val) 
    public static void fill(boolean[] a, int fromIndex, int toIndex, boolean val)
    
    public static void fill(char[] a, char val)
    public static void fill(char[] a, int fromIndex, int toIndex, char val) 
    
    public static void fill(byte[] a, byte val)
    public static void fill(byte[] a, int fromIndex, int toIndex, byte val) 
    
    public static void fill(short[] a, short val)
    public static void fill(short[] a, int fromIndex, int toIndex, short val) 
    
    public static void fill(int[] a, int val)
    public static void fill(int[] a, int fromIndex, int toIndex, int val)
    
    public static void fill(long[] a, long val)
    public static void fill(long[] a, int fromIndex, int toIndex, long val)
    
    public static void fill(float[] a, float val) 
    public static void fill(float[] a, int fromIndex, int toIndex, float val) 
    
    public static void fill(double[] a, double val)
    public static void fill(double[] a, int fromIndex, int toIndex,double val)
    

    6.数组Copy

    (1)指定长度,把入参数组的内容复制为副本,返回副本

    基础类型数组copyOf方法:

    public static byte[] copyOf(byte[] original, int newLength) {
        byte[] copy = new byte[newLength];
        System.arraycopy(original, 0, copy, 0,
                             Math.min(original.length, newLength));
        return copy;
    }
    
    public static boolean[] copyOf(boolean[] original, int newLength)
    public static char[] copyOf(char[] original, int newLength)
    public static short[] copyOf(short[] original, int newLength)
    public static int[] copyOf(int[] original, int newLength) 
    public static long[] copyOf(long[] original, int newLength)
    public static float[] copyOf(float[] original, int newLength)
    public static double[] copyOf(double[] original, int newLength)
    

    对象类型数组copyOf方法:

    public static <T> T[] copyOf(T[] original, int newLength)
    public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) 
    

    (2)指定起、止索引,把入参数组的内容复制为副本,返回副本

    基础类型数组copyOfRange方法:

    public static boolean[] copyOfRange(boolean[] original, int from, int to)
    public static char[] copyOfRange(char[] original, int from, int to)
    public static byte[] copyOfRange(byte[] original, int from, int to)
    public static short[] copyOfRange(short[] original, int from, int to)
    public static int[] copyOfRange(int[] original, int from, int to)
    public static long[] copyOfRange(long[] original, int from, int to)
    public static float[] copyOfRange(float[] original, int from, int to)
    public static double[] copyOfRange(double[] original, int from, int to)
    

    对象类型数组copyOfRange方法:

    public static <T> T[] copyOfRange(T[] original, int from, int to)
    public static <T,U> T[] copyOfRange(U[] original, int from, int to, Class<? extends T[]> newType)
    

    (3)指定范围Copy数组(在System中定义)

    public static native void arraycopy(Object src,  int  srcPos,
                                            Object dest, int destPos,
                                            int length);
    

    7.数组转换成字符串

    (1)一维数组转换成字符串

    public static String toString(boolean[] a)
    {
        if (a == null)
          return "null";
        int iMax = a.length - 1;
        if (iMax == -1)
            return "[]";
    
        StringBuilder b = new StringBuilder();
        b.append('[');
        for (int i = 0; ; i++) {
            b.append(a[i]);
            if (i == iMax)
                return b.append(']').toString();
            b.append(", ");
        }
    }
    

    其他类型数组类似方法:

    public static String toString(char[] a)
    
    public static String toString(byte[] a)
    public static String toString(short[] a)
    public static String toString(int[] a)
    public static String toString(long[] a)
    
    public static String toString(float[] a)
    public static String toString(double[] a)
    
    public static String toString(Object[] a)
    

    (2)多维数组转换成字符串

    public static String deepToString(Object[] a)
    

    8.数组转换成ArrayList

    public static <T> List<T> asList(T... a) {
       return new ArrayList<>(a);
    }
    

    样例:

    List intList1 = Arrays.asList(1,4,7,11,15);
    

    Arrays.asList()将一个数组转化为一个ArrayList。

    这个方法会返回一个ArrayList类型的对象,这个ArrayList类并非java.util.ArrayList类,而是Arrays类的静态内部类!对这个对象的列表进行添加、删除、更新操作,就会报UnsupportedOperationException异常。

    所以,如下样例中:

    • 第一句:是新创建了1个对象,通过Arrays类的静态内部类对象初始化。所以,list1 列表是可添加、删除操作的。
    • 第二句:list2直接引用通过Arrays类的静态内部类对象。所以,添加、删除操作会报异常;但是可以修改对象中的内容。
       List<String> list1 = new ArrayList<String>(Arrays.asList(args)); 
       List<String> list2 = Arrays.asList("hello", "world");
    
  • 相关阅读:
    Iptables 之二扩展模块 nat
    sudo 命令
    7、CentOS6 编译安装
    MySQL5.7 基础之二 DCL DML
    SQL Server 2008R2安装
    6、httpd2.4 编译安装LAMP
    MySQL 基础之一
    gulp
    msbuild
    inno setup
  • 原文地址:https://www.cnblogs.com/yickel/p/14793084.html
Copyright © 2011-2022 走看看