Arrays类算是一个比较常用的类,之前一直没看过它的API,不知道这个类到底可以做什么,今天把源码翻了一遍,记一下这个类里面有用的方法。
一开头是一些排序方法:
...
public static void sort(int[] a)
public static void sort(int[] 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(short[] a)public static void sort(short[] a, int fromIndex, int toIndex)
...
可以看出来,在排序部分中,Arrays类为一些基本类型数组提供了排序方法,但是仅支持升序排序,方法内部是通过调用DualPivotQuicksort这个类的排序算法来实现的,DualPivotQuicksort这个类是专门做快速排序的,代码又有点多,下次有时间再看。
Arrays支持排序的基本类型有:int[],long[],short[],char[],double[],byte[],float[],double[]。其实就是支持全部的基本类型==!。
中间还有一个内部类:
static final class LegacyMergeSort,这个类的解释是可以通过设置一个系统变量来调用旧版本的排序。貌似是为了兼容低版本的JDK的。再下面可以看到public static void sort(Object[] a) { if (LegacyMergeSort.userRequested) legacyMergeSort(a); else ComparableTimSort.sort(a); }这个方法,可以升序排列Object[]类型的数组。可以看出来排列Object的时候可以选择使用低版本的legacyMergeSort或者是新的ComparableTimSort方法。
对于Object也一样提供了public static void sort(Object[] a, int fromIndex, int toIndex)来局部排序。并且需要注意的是,数组内所有的Object类型都要实现Comparable接口All elements in the array must implement the {@link Comparable}* interface.再往下看:public static <T> void sort(T[] a, Comparator<? super T> c),还支持泛型的排序。public static int binarySearch(long[] a, long key),支持以前学过的二分查找,针对的是已排序的数组。public static int binarySearch(long[] a, int fromIndex, int toIndex,long key),还支持一手局部二分查找。并且为每种基本类型都写了整体和局部的二分查找方法。依旧是支持泛型:public static <T> int binarySearch(T[] a, T key, Comparator<? super T> c)public static <T> int binarySearch(T[] a, int fromIndex, int toIndex,T key, Comparator<? super T> c)再下面的部分是一些判断数组是否相等的方法:public static boolean equals(long[] a, long[] a2)依旧是支持所有基本类型,并且多了public static boolean equals(boolean[] a, boolean[] a2)和public static boolean equals(Object[] a, Object[] a2)
下面是填充数组的方法,意思是将数组a的每一个元素值都设置为valpublic static void fill(long[] a, long val)也提供了局部版本public static void fill(long[] a, int fromIndex, int toIndex, long val)依旧是支持上面提到的所有类型。接下来是一些复制数组的方法public static <T> T[] copyOf(T[] original, int newLength)public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType)public static byte[] copyOf(byte[] original, int newLength)...所有基本类型的Copy方法所有的copy方法内部都是靠本地化的System.arraycopy方法实现的,这个方法贯穿了整个collection框架。
以及局部复制的copyOfRange方法,依旧是支持所有基本类型。public static <T> T[] copyOfRange(T[] original, int from, int to)接下来是一个将数组转换成ArrayList的方法,注意这个ArrayList不是框架里的哪个,而是Arrays里的一个内部类。public static <T> List<T> asList(T... a) { return new ArrayList<>(a); }private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable剩下的就是一些HashCode,toString方法了,实现了各种不同的版本,没啥好看的了。Arrays里面的方法大概就这些,有些还是挺方便的,以后可以用一下,不用自己一直for循环了。