JDK之Arrays类

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的每一个元素值都设置为val
public 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循环了。



 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值