Java基础(九)数组工具类

数组工具类


1. Arrays类

a. 导入方法
import java.util.Arrays;
b. Arrays类常用的方法
方法返回类型说明
equals(array1, array2)boolean比较两个数组是否相等
sort(array)void对数组 array 的元素进行排序
toString(array)String把一个数组 array 转换成一个字符串
fill(array, val)void把数组 array 的所有元素都赋值为 val
copyOf(array, length)与 array 数据类型一致把数组 array 复制成一个长度为 length 的新数组
binarySearch(array, val)int查询元素值 val 在数组 array 中的下标
compare(array1, array2)int按照字典顺序比较数组,前面的数组大,返回大于 0 的值,反之返回小于 0 的值
copyOfRange(arr, start, end)与 array 数组类型一致将指定数组的指定范围复制到新数组中
fill(arr, strats, end, val)void将指定值分配给指定数组的指定范围的每个元素
mismatch(array1, arrays2)int查找并返回两个数组之间第一个不匹配的索引,否则如果未找到不匹配,则返回 -1

2. Arrays类的应用

(1)比较两个数组是否相等

Arrays 类的 equals() 方法用于比较两个数组是否相等。只有当两个数组长度相等,对应位置也一一相等时,该方法返回 true ,否则返回 false。

import java.util.Arrays;

public class Example19 {
    public static void main(String[] args) {
        // 比较两个数组是否相等
        int[] arr1 = {10, 20, 30};
        int[] arr2 = {10, 20, 30};
        int[] arr3 = {10, 20, 30};
        System.out.println(Arrays.equals(arr1,arr2));
        System.out.println(Arrays.equals(arr1,arr3));
        System.out.println(arr1.equals(arr2));
        System.out.println(arr1 == arr2);
    }
}
// true false false false

在这段代码中,Arrays.equals(arr1, arr2)调用 Arrays 类的静态方法来比较两个数组的内容是否相等。它会逐个比较两个数组对应位置的元素值是否相等,如果所有元素都相等,则返回 true。

arr1.equals(arr2)调用数组对象的 equals 方法来比较两个数组是否是同一个对象。由于数组是对象,使用 equals 方法默认会比较两个数组的引用地址是否相等。在这个例子中,arr1 和 arr2 是不同的数组对象,即使它们的内容相同,它们的引用地址不同,因此 arr1.equals(arr2) 返回的结果是 false。

arr1 == arr2直接比较两个数组的引用地址是否相等。同样地,arr1 和 arr2 是不同的数组对象,因此它们的引用地址也不相等,所以 arr1 == arr2 的结果是 false。

综上所述,Arrays.equals(arr1, arr2) 可以比较两个数组的内容是否相等,而 arr1.equals(arr2) 和 arr1 == arr2 比较的是数组对象的引用地址。因此,三者的结果不一样。

(2)对数组元素进行升序排序

Arrays 类的 sort() 对数组的元素进行升序排序。

import java.util.Arrays;
import java.util.Collections;

public class Sort {
    public static void main(String[] args) {
        Integer[] arr = {5, 2, 8, 1, 9};

        // 升序排序
        Arrays.sort(arr);
        System.out.println("升序排序:" + Arrays.toString(arr));

        //降序排序
        Collections.reverse(Arrays.asList(arr));
        System.out.println("降序排序:" + Arrays.toString(arr));
    }
}
/*
升序排序:[1, 2, 5, 8, 9]
降序排序:[9, 8, 5, 2, 1]
*/
  • Arrays.aList() 是一个用于将数组转换为列表的方法。它接收一个数组作为参数,并返回一个固定大小的列表,该列表由给定的数组支持。
  • 需要注意的是,Arrays.asList() 返回的列表是一个固定大小的列表,意味着不能改变其大小(添加或删除元素),否则会抛出 UnsupportedOperationException 异常。因为底层仍然是原始数组,所以在使用该列表时,对数组的修改会直接反映到列表中,反之亦然。
  • Collections.reverse() 是一个用于反转列表元素顺序的方法。它接收一个列表作为参数,并修改该列表,使得列表中的元素按照相反的顺序排列。

(3)将数组元素赋值为相同的值

Arrays 类的 fill() 方法用于把数组 array 的一些或全部元素赋值为 val 。

import java.util.Arrays;

public class FillExample {
    public static void main(String[] args) {
        int[] arr1 = {10, 10, 10, 10, 10};
        int[] arr2 = {10, 10, 10, 10, 10};

        // 全部赋值
        Arrays.fill(arr1, 50);
        System.out.println("arr1为" + Arrays.toString(arr1));
        // 部分赋值
        Arrays.fill(arr2, 1, 3, 30);
        System.out.println("arr2为" + Arrays.toString(arr2));
    }
}
/*
arr1为[50, 50, 50, 50, 50]
arr2为[10, 30, 30, 10, 10]
*/
  • 全部赋值
    • Arrays.fill(arr, val) 中,arr 为要赋值的数组,val 需要赋值的值。
  • 部分赋值
    • Arrays.fill(arr, fromIndex, toIndex, val) 中,arr 为要赋值的数组,val 需要赋值的值,fromIndex 为开始赋值的数组下标,toIndex 为结束赋值的数组下标(不包含该下标的值)。

(4)将数组赋值成一个长度为设定值的新数组,新数组内容复制

初始化一个整型一维数组,使用 Arrays 类的 copyOf() 方法把数组复制成一个长度为设定值的新数组。
初始化一个整型一维数组,使用 System 类的 arraycopy() 方法把数组复制成一个长度为设定值的新数组。

import java.util.Arrays;

public class CopyOfExample {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3 ,5, 7};
        // Arrays.copyOf() 复制数组
        // 复制新数组 newLength > arr.length
        int[] arr1 = Arrays.copyOf(arr,7);
        System.out.println("copyOf() arr1 = " + Arrays.toString(arr1));
        // 复制新数组 newLength = arr.length
        int[] arr2 = Arrays.copyOf(arr,5);
        System.out.println("copyOf() arr2 = " + Arrays.toString(arr2));
        // 复制新数组 newLength < arr.length
        int[] arr3 = Arrays.copyOf(arr,3);
        System.out.println("copyOf() arr3 = " + Arrays.toString(arr3));

        // System.arraycopy() 赋值
        int[] arr4 = new int[arr.length + 1];
        System.arraycopy(arr, 0, arr4, 0, 2);
        System.arraycopy(arr, 2, arr4, 3, 3);
        arr4[2] = 6;
        System.out.println("arraycopy() arr4 = " + Arrays.toString(arr4));

    }
}

/* 输出
copyOf() arr1 = [1, 2, 3, 5, 7, 0, 0]
copyOf() arr2 = [1, 2, 3, 5, 7]
copyOf() arr3 = [1, 2, 3]
arraycopy() arr4 = [1, 2, 6, 3, 5, 7]
*/
  • Arrays.copyOf()
    • Arrays.copyOf(arr, newLength) 中,arr 为要复制的数组,newLength 为新建数组的长度。
    • 复制新数组 newLength > arr.length,用该数组类型的默认值填充。
    • 复制新数组 newLength = arr.length,新数组和原数组一样。
    • 复制新数组 newLength < arr.length,新数组赋值原数组的前 newLength 位。
  • System.arraycopy()
    • System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
    • src: 源数组,被复制的数组。
    • srcPos: 源数组的起始位置,从这一位开始复制。
    • dest: 目标数组。
    • destPos: 目标数组的位置。
    • length: 复制多少元素, 不能比 src.length 大。

(5)查询元素在数组中的下标

Arrays 类的 binarySearch(Object[], Object key) 方法用于查询数组元素在数组中的下标。调用该方法时要求数组中的元素已经按照升序排列

import java.util.Arrays;

public class Learn1002 {
    public static void main(String[] args) {
        // binarySearch()函数
        int[] arr = {10, 50, 30, 40, 20};
        Arrays.sort(arr);
        System.out.println("arr = " + Arrays.toString(arr));
        // 查找元素在数组内
        int index = Arrays.binarySearch(arr,40);
        System.out.println("index = " + index);
        // 查找元素小于数组中最小值
        index = Arrays.binarySearch(arr, 0);
        System.out.println("index = " + index);
        // 查找元素在数组最小到最大值之间,但不在数组内
        index = Arrays.binarySearch(arr, 45);
        System.out.println("index = " + index);
        // 查找元素大于数组中最大值
        index = Arrays.binarySearch(arr, 60);
        System.out.println("index = " + index);
    }
}

/* 
输出:
arr = [10, 20, 30, 40, 50]
index = 3
index = -1
index = -5
index = -6
*/

如果 key 在数组中,则返回搜索值的索引;如果 key 不在数组中,返回值为 -1- (插入点)。插入点的值有如下四种情况:

  • 搜索值是数组元素,从 0 开始计数,得搜索值的索引值
  • 搜索值不是数组元素,且在数组范围内,从 1 开始计数,得 “ - 插入点索引值”;
  • 搜索值不是数组元素,且大于数组内元素,索引值为 - (length + 1);
  • 搜索值不是数组元素,且小于数组内元素,索引值为 -1.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值