Java 8增强的工具类 Arrays(一)

时间:2021-11-12 19:26:20

Arrays是一个java.util包下的一个数组工具类,提供了大量的static方法用来对数组进行操作,方便程序员开发中使用。具体方法如下:

 

一、搜索方法:

1.1int binarySearch(type[] a ,type key)

作用:使用二分法,从一个数组中查找key的下标值,如果存在返回下标,如果不存在返回值为负数。

在源码中,对这个方法进行是重载,参数的类型在变化,从8个基本数据类型 ,到Object以及自定义的类型都可以使用该方法进行查找元素。

1.2int binarySearch(type[] a ,type key,int fromIndex,int toIndex)

作用:重载上一个方法,增加了开始下标和结束下标,也就是规定了查找的范围。

1.3、源码:

private static int binarySearch0(long[] a, int fromIndex, int toIndex,long key) {

        int low = fromIndex;

        int high = toIndex - 1;

 

        while (low <= high) {

            int mid = (low + high) >>> 1;

            long midVal = a[mid];

 

            if (midVal < key)

                low = mid + 1;

            else if (midVal > key)

                high = mid - 1;

            else

                return mid; // key found

        }

        return -(low + 1);  // key not found.

  }

解读:获取任意类型的数组,一个对应类型的元素key,还有int类型的开始和结束下标,为了公用一个算法方法,我们先给定两个局部变量,如果没有指定开始和结束下标那么指定从0开始到数组a的长度-1结束。然后循环,循环判定条件是最小范围值小于等于最大范围值。然后中间值和key的比较,确定范围,最后确定key所在位置的index,直接返回。如果没有该值,直接返回负数。

 

二、复制方法:

2.1type[] copyOf(type[] original,int length)

作用:复制original数组到一个新数组,length为新数组的长度,如果length的值大于original的长度,那么新数组的其他值补00.0falsenull

2.2type[] copyOfRange(type[] original,int fromIndex,int toIndex)

作用:该方法是上面方法的重载,规定了开始复制的下标和结束复制的下标,也就是复制规定位置的数组元素到新数组中。

2.3、源码:

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 native void arraycopy(Object src,  int  srcPos,

                                        Object dest, int destPos,

                                        int length);

Java中这个方法是调用了System类中的arraycopy方法实现的,但是arraycopy有一个修饰符native是咋回事了?如果方法用native关键字修饰,说明该方法有实现,但不是使用java代码实现的,它的实现是在一个DLL文件中,可能使用C语言等其他语言实现,方便了java和硬件的交互,缺点是增加开销。Native方法也被称为本地方法。

 

public static byte[] copyOfRange(byte[] original, int from, int to) {

        int newLength = to - from;

        if (newLength < 0)

            throw new IllegalArgumentException(from + " > " + to);

        byte[] copy = new byte[newLength];

        System.arraycopy(original, from, copy, 0,

                         Math.min(original.length - from, newLength));

        return copy;

}

解读:先计算出新数组的长度,使用结束下标-开始下标,如果小于0,说明结束下标小于开始下标,这样不成立,所以手动抛出异常。然后调用System类的arraycopy方法,执行。

2.4、启发:写代码要有一定的严谨性,有开始结束的位置下标,一定要比较两个的大小,抛出异常。

我们也可以直接调用System类的arraycopy方法,对数组直接进行赋值

 

三、判断方法:

3.1boolean equals(long[] a1,long[] a2)

作用:判断两个数组的长度和内容是否相同(数组元素必须一一对应并相同)

3.2、源码:

 public static boolean equals(long[] a, long[] a2) {

        if (a==a2)

            return true;

        if (a==null || a2==null)

            return false;

 

        int length = a.length;

        if (a2.length != length)

            return false;

 

        for (int i=0; i<length; i++)

            if (a[i] != a2[i])

                return false;

 

        return true;

}

 

四、赋值方法:

4.1void fill(type[] a,type val)

作用:将数组中的所有元素都赋值为val

4.2void fill(type[] a,int fromIndex,int toIndex,type val)

作用:同上相同,指定了开始和结束的范围

4.3、源码:

public static void fill(byte[] a, byte val) {

        for (int i = 0, len = a.length; i < len; i++)

            a[i] = val;

}

 

 public static void fill(byte[] a, int fromIndex, int toIndex, byte val) {

        rangeCheck(a.length, fromIndex, toIndex);

        for (int i = fromIndex; i < toIndex; i++)

            a[i] = val;

}

 

//范围检查方法

private static void rangeCheck(int length, int fromIndex, int toIndex) {

        if (fromIndex > toIndex) {

            throw new IllegalArgumentException(

                "fromIndex(" + fromIndex + ") > toIndex(" + toIndex + ")");

        }

        if (fromIndex < 0) {

            throw new ArrayIndexOutOfBoundsException(fromIndex);

        }

        if (toIndex > length) {

            throw new ArrayIndexOutOfBoundsException(toIndex);

        }

}



联系作者:

Java 8增强的工具类 Arrays(一)


加群交流:

Java 8增强的工具类 Arrays(一)