java基础之Array和Arrays类

数组类之Array和Arrays

在上篇博客,我们了解了数组的概念,学习了数组的一些基本操作,但是有没有觉得很麻烦勒?

java中提供了两个很方便的操作数组的类,用于数组的动态创建及方法调用,下面我们就来学习一下这两个类。

Array类

Array是java.lang.reflect下的一个类,并且不能被new出来,也就是不能被实例化,它的构造器被private所修饰,且由于类被final修饰因此不能被继承,参考源码如下

package java.lang.reflect;

/**
 * The {@code Array} class provides static methods to dynamically create and
 * access Java arrays.
 *
 * <p>{@code Array} permits widening conversions to occur during a get or set
 * operation, but throws an {@code IllegalArgumentException} if a narrowing
 * conversion would occur.
 *
 * @author Nakul Saraiya
 */
public final
class Array {

    /**
     * Constructor.  Class Array is not instantiable.
     */
    private Array() {}
    
    // 以下省略
}

该类中提供了一系列的静态方法,我截取源码中的一部分看看

    public static Object newInstance(Class<?> componentType, int length)
        throws NegativeArraySizeException {
        return newArray(componentType, length);
    }

    public static Object newInstance(Class<?> componentType, int... dimensions)
        throws IllegalArgumentException, NegativeArraySizeException {
        return multiNewArray(componentType, dimensions);
    }
    
    public static native int getLength(Object array)
        throws IllegalArgumentException;

    public static native Object get(Object array, int index)
        throws IllegalArgumentException, ArrayIndexOutOfBoundsException;

    public static native void setBoolean(Object array, int index, boolean z)
        throws IllegalArgumentException, ArrayIndexOutOfBoundsException;

    

可能看到这里有点懵逼啊。。。啥玩意,static倒是认识,native是个什么鬼?

你们也不用去百度了,我已经百度过了,度娘里的大神是这么说的:native主要用于方法上1、一个native方法就是一个Java调用非Java代码的接口。一个native方法是指该方法的实现由非Java语言实现,比如用C或C++实现。2、在定义一个native方法时,并不提供实现体(比较像定义一个Java Interface),因为其实现体是由非Java语言在外面实现的。native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中。Java语言本身不能对操作系统底层进行访问和操作,但是可以通过JNI接口调用其他语言来实现对底层的访问。

因为java是由c编写的,那么这一部分的代码应该是由c去实现的,我们不用关心它是怎么实现的,我们只需要会使用即可

public static void main(String[] args) {
        int[] array = {1,2,3};
        System.out.println(Array.get(array,1));  // 获取一个数组下标为1的元素,返回为object对象
        System.out.println(Array.getInt(array,2));  // 获取一个数组下标为2的元素,返回为int
        Array.setInt(array,2,4);  // 设置数组下标为2的元素为4,此时数组为{1,2,4}
        String[] strings = (String[]) Array.newInstance(String.class,3);  // 创建一个长度为3的字符串数组
    }

大概也就以上几类方法,也比较简单,就不具体展开了,使用的较少,我们主要还是看Arrays类

Arrays类

这个类提供的好用的方法远远多于Array,也是平时我们开发时候经常使用的一个工具类,下面来看看

Arrays是java.util包下的一个工具类,提供了许多对数组操作的静态方法,包括数组的排序,对比,转化等等系列方法,十分的好用。

数组转字符串

Arrays.toString

public static void main(String[] args) {
        int[] array = {3,2,1,4,5};
        System.out.println(array);  // 输出 [I@61bbe9ba
        System.out.println(Arrays.toString(array));  // 输出 [3, 2, 1, 4, 5]
    }

数组排序

Arrays.sort

从小到大排序

public static void main(String[] args) {
        int[] array = {3,2,1,4,5};
        Arrays.sort(array);  // 从小到大排序
        System.out.println(Arrays.toString(array));  // 输出 [1, 2, 3, 4, 5]
    }

查看了一下Arrays的方法,并没有提供从大到小的排序方法,那么如何从大到小排序呢?我们就需要重写compare方法来实现从大到小。看到这里,经常使用python来进行编程的朋友可能要骂娘了,我靠,这么麻烦,python中一个sorted函数不就搞定啦?那也没办法,java就是这个亚子,接受吧!

从大到小排序

public static void main(String[] args) {
        Integer[] array = {3,2,1,4,5};

        Comparator<Integer> cmp = new Comparator<Integer>() {
            public int compare(Integer i1, Integer i2) {
                return i2-i1;
            }
        };
        Arrays.sort(array,cmp);  // 从大到小排序
        System.out.println(Arrays.toString(array));  // 输出 [5, 4, 3, 2, 1]
    }

其实还有一种方法是这个亚子的,偷偷告诉你们,要牢记于心,不然就要像上面一样重写方法啦,懒人才不会去重写!

public static void main(String[] args) {
        Integer[] array = {3,2,1,4,5};
        Arrays.sort(array, Collections.reverseOrder());  // 从大到小排序
        System.out.println(Arrays.toString(array));  // 输出 [5, 4, 3, 2, 1]
    }

数组比较

Arrays.equals  比较一维数组

Arrays.deepEquals  比较多维数组

    public static void main(String[] args) {
        int[] array1 = {1,2,3};
        int[] array2 = {1,2,3};
        int[] array3 = {1,2,4};
        System.out.println(Arrays.equals(array1,array2));  // 数组的比较,返回true
        System.out.println(Arrays.equals(array1,array3));  // 数组的比较,返回false
    }
public static void main(String[] args) {
        Integer[][] array1 = {{1,2,3}};
        Integer[][] array2 = {{1,2,3}};
        Integer[][] array3 = {{1,2,4}};
        System.out.println(Arrays.equals(array1,array2));  // 多维数组的比较,返回false
        System.out.println(Arrays.equals(array1,array3));  // 多维数组的比较,返回false
        System.out.println(Arrays.deepEquals(array1,array2));  // 多维数组深比较,判断是否是同一个对象,返回true
    }

数组和ArrayList互转

toArray  

Arrays.asList 

public static void main(String[] args) {
        Integer[] array = {1,2,3};
        List<Integer> arrayList = new ArrayList<>(Arrays.asList(array));  // 数组转ArrayList
        System.out.println(arrayList);  // 输出 [1, 2, 3]
        arrayList.toArray();  // ArrayList转数组
    }

数组填充

Arrays.fill

public static void main(String[] args) {
        Integer[] array = new Integer[5];
        Arrays.fill(array,0,3,9); // 给数组下标 0~2的元素填充9
        System.out.println(Arrays.toString(array));  // 输出[9, 9, 9, null, null]
    }

数组拷贝

Arrays.copyOf

public static void main(String[] args) {
        Integer[] array = {1,2,3,4,5};
        Integer[] arrayCopy = Arrays.copyOf(array,10);  // 拷贝并生成一个新的数组对象,并设置长度为10
        System.out.println(Arrays.toString(arrayCopy));
    }

以上就是常用的一些Arrays的方法,上面只是举了一些demo,还需要勤加练习才能熟练掌握。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值