java.util.Arrays的用法(二)

上一期了解了java.util.Arrays的sort、binarySearch、asList方法的使用,这一期了解剩下的几个常用方法:

  • copyOf/copyOfRange

    ​ copyOf用于复制指定的数组,传参很简单,给一个源数组,和一个长度即可,返回需要的长度。如果长度大于源数组长度,会自动填充0(int)或null(String),如果长度小于源数组长度,则截取。该方法只提供从0开始的位置截取,如果要指定开始位置,可以使用copyOfRange方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @Test
    public void copyOf(){
    int[] array = new int[3];
    Arrays.fill(array,2);
    int[] newArray = Arrays.copyOf(array, 5);
    //输出[2, 2, 2, 0, 0],后面两个0自动填充的
    System.out.println("==== " + Arrays.toString(newArray));
    //输出[0, 0],第3 到 第5 个位置已经超出源数组范围,自动填充0
    int[] newArray2 = Arrays.copyOfRange(array, 3,5);
    System.out.println("==== " + Arrays.toString(newArray2));
    }
  • System.arraycopy/copyOf/copyOfRange/clone的比较

    1)copyOf和copyOfRange是很友好的两个方法,并不会因为数组下标越界而抛出异常,而是自动填充了值,查看copyOf和copyOfRange的源码会发现,其实他们是调用System.arraycopy 方法实现的;

    2)System.arraycopy 方法是会抛数组越界异常的。

    3)System.arraycopy方法和Arrays.copyOf方法均可以实现数组类型的向上转换,即子类型的数组可以复制到父类型数组中,但不可以实现向下转换,即父类型的数组不可以复制到子类型数组中。

    4)System.arraycopy、copyOf、copyOfRange都属于“浅复制”,对于对象而言,他们只是复制了对象的引用,而不是创建新的对象。

    5)clone比较特殊,对于对象而言,它是深拷贝,但是对于数组而言,它是浅拷贝。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    @Test
    public void copyOf2(){
    Person p1 = new Person();
    p1.setAge(29);
    p1.setName("杰克");
    p1.setSex("男");
    Person p2 = new Person();
    p2.setAge(23);
    p2.setName("露丝");
    p2.setSex("女");
    Person[] persons1 = new Person[]{p1, p2};
    Person[] copyArray = Arrays.copyOf(persons1, 2);
    //将persons1的每个对象进行clone
    Person[] cloneArray = new Person[2];
    for(int i=0;i<persons1.length;i++){
    cloneArray[i] = persons1[i].clone();
    }
    //数组clone
    Person[] cloneArray2 = persons1.clone();
    //true
    System.out.println("copyOf与源数组比较" + Arrays.deepEquals(persons1,copyArray));
    //false
    System.out.println("对象clone与源数组比较" + Arrays.deepEquals(persons1,cloneArray));
    //true
    System.out.println("数组clone与源数组比较" + Arrays.deepEquals(persons1,cloneArray2));
    }

  • fill

    fill方法很简单,也很局限性,将一个值填充到数组的任意位置。

    1
    2
    3
    4
    5
    6
    7
    @Test
    public void fill(){
    String[] array2 = new String[3];
    Arrays.fill(array2, 1 , 2 , "hello");
    //输出 [null, hello, null],对于没填充的范围会自动补全,String类型补位null
    System.out.println("==== " + Arrays.toString(array2));
    }

坚持原创技术分享,您的支持将鼓励我继续创作!
分享