likes
comments
collection
share

Java零基础之数组篇(3):深入掌握Java数组与常用方法!在上一期《Java数组的基本操作》中,我们学习了如何通过索

作者站长头像
站长
· 阅读数 23

  本期内容,我们将深入探讨**Arrays类中的常用方法**,并通过具体示例展示如何高效地操作数组。这些方法的掌握不仅能够提升开发效率,还能让代码更加简洁明了。

Arrays 类中的常用方法(java.util.Arrays

  Java中的Arrays类属于java.util包,提供了对数组的各种实用操作。它是处理数组的一个重要工具类。通过Arrays类中的方法,我们可以轻松完成许多数组操作,避免手动编写复杂的代码逻辑。接下来,我们将详细介绍Arrays类中的一些常用方法。

1. 排序:Arrays.sort(array)

  排序是对数组元素进行排列的常见操作,无论是在处理数字、字符串还是其他对象时,排序都十分重要。在Java中,Arrays.sort()方法能够帮助我们快速对数组进行排序。

基本用法:

  Arrays.sort()方法使用了双轴快速排序算法,它在大多数情况下都能提供优异的性能。该方法可以用于基本数据类型数组(如int[]double[]等),也可以用于对象数组(如String[])。

示例

int[] numbers = {5, 2, 9, 1, 3};
Arrays.sort(numbers);
System.out.println(Arrays.toString(numbers));  // 输出:[1, 2, 3, 5, 9]

  在这个例子中,我们使用Arrays.sort()对一个int类型数组进行升序排序,排序后的数组是按数值从小到大排列。

对象数组排序:

  对于对象数组(如字符串数组),排序基于对象实现的Comparable接口的compareTo()方法。对于String类型数组,排序默认按字典顺序进行:

String[] fruits = {"Banana", "Apple", "Orange"};
Arrays.sort(fruits);
System.out.println(Arrays.toString(fruits));  // 输出:[Apple, Banana, Orange]

  如果要进行自定义排序,可以使用Arrays.sort(array, Comparator)方法。此方法允许我们提供一个自定义的比较器来控制排序规则,例如按字符串长度排序:

Arrays.sort(fruits, (a, b) -> a.length() - b.length());
System.out.println(Arrays.toString(fruits));  // 输出:[Apple, Orange, Banana]

  这种自定义比较的方式特别适合于需要特定排序逻辑的场景,比如根据对象的某个属性进行排序。

2. 查找:Arrays.binarySearch(array, value)

  Arrays.binarySearch()是一个基于二分查找算法的查找方法,它能够在一个已经排序的数组中快速找到某个元素的索引。如果数组未排序,结果将是不可预测的,因此在使用binarySearch()之前必须确保数组已经经过排序。

基本用法:
int[] numbers = {1, 2, 3, 5, 9};
int index = Arrays.binarySearch(numbers, 5);
System.out.println(index);  // 输出:3

  在这个示例中,我们查找元素5在数组中的索引,结果是3。如果查找的元素不存在于数组中,binarySearch()会返回一个负数,表示该元素应插入的位置的负值减去1。

注意:

  binarySearch()只适用于已经排序的数组,未排序数组调用该方法可能返回错误的结果。因此,在调用binarySearch()之前,确保先调用Arrays.sort()对数组进行排序。

3. 比较:Arrays.equals(array1, array2)

  在Java中,数组是引用类型,因此直接使用==来比较两个数组时,比较的是它们的引用地址,而不是数组的内容。为了比较两个数组中的元素是否相同,Java提供了Arrays.equals()方法。

基本用法:
int[] arr1 = {1, 2, 3};
int[] arr2 = {1, 2, 3};
int[] arr3 = {1, 2, 4};

System.out.println(Arrays.equals(arr1, arr2));  // 输出:true
System.out.println(Arrays.equals(arr1, arr3));  // 输出:false

  Arrays.equals()方法不仅会比较数组的长度,还会逐个比较数组中的元素。如果所有元素都相同,则返回true,否则返回false

  如下是对这段代码的解析:

  这段代码演示了如何使用java.util.Arrays.equals()方法来比较两个数组的内容。该方法可以判断两个数组是否长度相同内容完全一致,非常实用,特别是在需要判断数组相等性的时候。接下来我们将逐步解析这段代码,并详细解释其中的概念。

  1. 数组的声明与初始化
int[] arr1 = {1, 2, 3};
int[] arr2 = {1, 2, 3};
int[] arr3 = {1, 2, 4};

在这里,声明并初始化了三个整型数组:

  • arr1 = {1, 2, 3}
  • arr2 = {1, 2, 3}
  • arr3 = {1, 2, 4}

这三个数组都包含三个元素,但arr3中的第三个元素不同于arr1arr2。前两个数组arr1arr2的内容完全相同,arr3则仅在前两个元素上与它们相同。

  1. 使用Arrays.equals()比较数组

Arrays.equals(arr1, arr2)

System.out.println(Arrays.equals(arr1, arr2));  // 输出:true

Arrays.equals(arr1, arr2)是用于比较数组arr1arr2的内容。让我们详细分析这个方法的工作原理:

  • 数组长度检查:首先,Arrays.equals()会检查两个数组的长度。如果长度不同,方法立即返回false。在这个例子中,arr1arr2的长度都是3,因此长度检查通过。

  • 逐元素比较:接下来,该方法会逐个比较数组中的每个元素。首先比较arr1[0]arr2[0](它们的值都是1),然后比较arr1[1]arr2[1](值为2),最后比较arr1[2]arr2[2](值为3)。由于所有对应位置的元素都相同,方法返回true

arr1arr2的内容完全相同,因此Arrays.equals(arr1, arr2)返回true,表示两个数组相等。

Arrays.equals(arr1, arr3)

System.out.println(Arrays.equals(arr1, arr3));  // 输出:false

接下来,我们使用Arrays.equals()来比较arr1arr3

  • 数组长度检查:同样,Arrays.equals()首先检查数组的长度。由于arr1arr3的长度都是3,因此长度检查通过。

  • 逐元素比较:然后方法逐一比较数组的每个元素。arr1[0]arr3[0]都等于1arr1[1]arr3[1]都等于2。然而,当比较arr1[2]arr3[2]时,前者的值为3,而后者为4,两个值不同。因此,方法立即返回false

由于arr1arr3在第三个元素上不同,因此Arrays.equals(arr1, arr3)返回false,表示两个数组不相等。

  1. Arrays.equals()方法的工作机制

Arrays.equals()java.util.Arrays类中的静态方法,专门用于比较两个数组的内容是否相同。它可以用于基本类型数组(如int[]double[]等)和引用类型数组(如String[])。

方法原理

  1. 数组长度检查:如果两个数组的长度不同,方法直接返回false,不再进行进一步的比较。
  2. 逐元素比较:如果数组的长度相同,Arrays.equals()会从第一个元素开始,逐个比较两个数组对应位置上的元素。如果某个元素不相等,方法立即返回false。只有当所有元素都相同时,方法才返回true

适用场景

  • 判断两个数组是否包含相同的数据。
  • 避免直接使用==操作符,因为==比较的是引用地址,而不是数组的内容。例如:
System.out.println(arr1 == arr2);  // 输出:false

即使arr1arr2的内容完全一致,使用==仍然返回false,因为它们是两个不同的对象。Arrays.equals()则用于正确比较数组内容。

多维数组比较:

  对于多维数组,Arrays.equals()只会比较第一层的引用,不能递归比较所有嵌套的数组。此时可以使用Arrays.deepEquals()方法,它会递归地比较多维数组中的所有元素。

int[][] arr1 = {{1, 2}, {3, 4}};
int[][] arr2 = {{1, 2}, {3, 4}};
System.out.println(Arrays.deepEquals(arr1, arr2));  // 输出:true
4. 转换为字符串:Arrays.toString(array)

  在编写代码时,调试数组往往需要将其内容输出为字符串。Arrays.toString()方法可以将数组转换为人类可读的字符串形式。对于多维数组,使用Arrays.deepToString()方法。

基本用法:
int[] numbers = {1, 2, 3, 4, 5};
System.out.println(Arrays.toString(numbers));  // 输出:[1, 2, 3, 4, 5]

  Arrays.toString()方法返回的字符串以方括号括起,元素之间用逗号和空格分隔。

多维数组的字符串表示:

  对于多维数组,使用Arrays.deepToString()可以递归地将数组转换为字符串形式。

int[][] matrix = {{1, 2}, {3, 4}};
System.out.println(Arrays.deepToString(matrix));  // 输出:[[1, 2], [3, 4]]
5. 数组复制:Arrays.copyOf(array, newLength)

  Arrays.copyOf()方法用于创建一个新的数组,并将原数组的内容复制到新数组中。你可以指定新数组的长度。如果新长度大于原数组,则新数组中多余的部分将填充默认值(如0null);如果新长度小于原数组,则只会复制前newLength个元素。

基本用法:
int[] original = {1, 2, 3};
int[] copy = Arrays.copyOf(original, 5);
System.out.println(Arrays.toString(copy));  // 输出:[1, 2, 3, 0, 0]

  此方法特别适用于需要扩展数组长度的场景。通过Arrays.copyOf(),我们可以灵活地创建新数组,同时保留原数组中的内容。

实际应用场景:

  当我们需要在程序中动态扩展数组时,Arrays.copyOf()非常有用。例如,当处理数据流或需要存储大量输入时,数组的固定大小可能成为限制。此时,copyOf()方法可以帮助我们扩展数组的容量。

6. 数组的长度属性:array.length

  length是Java数组的一个属性,用于获取数组的长度。在遍历数组或避免数组下标越界时,length属性非常重要。

基本用法:
int[] numbers = {1, 2, 3, 4, 5};
System.out.println(numbers.length);  // 输出:5

  不同于String类的length()方法,数组的length是一个属性,因此在使用时不需要加上括号。

结合使用这些方法的实用案例

  在实际编程中,常常需要将这些Arrays方法结合使用。例如,处理大量数据时,你可能需要先使用Arrays.sort()对数组进行排序,然后使用Arrays.binarySearch()查找某个元素。接下来可能需要将数组的某些部分复制或转换为字符串以供输出。

一个实际的例子:

public class day3 {

    public static void main(String[] args) {
        int[] data = {3, 1, 4, 1, 5, 9, 2, 6, 5};

        // 1. 排序数组
        Arrays.sort(data);
        System.out.println("Sorted array: " + Arrays.toString(data));

        // 2. 查找某个值
        int searchValue = 5;
        int index = Arrays.binarySearch(data, searchValue);
        System

                .out.println("Index of " + searchValue + ": " + index);

        // 3. 复制数组
        int[] extendedData = Arrays.copyOf(data, 12);
        System.out.println("Extended array: " + Arrays.toString(extendedData));

        // 4. 比较数组
        int[] anotherArray = {1, 2, 3};
        System.out.println("Arrays equal: " + Arrays.equals(data, anotherArray));
    }


}

代码解析:

  针对如上示例代码,这里我给大家详细的代码解释下,以便于大家理解,帮助大家早日掌握,仅供参考。

这段代码演示了如何使用java.util.Arrays类中的常用方法对数组进行操作,具体包括数组的排序、查找、复制和比较。让我们逐步解析每个部分的功能及实现细节。

1. 导入java.util.Arrays

在使用Arrays类中的静态方法前,我们需要导入java.util.Arrays类。这使得我们能够使用它提供的多种数组操作功能。

2. 主方法main和数组初始化

main方法中,我们首先声明并初始化了一个名为data的整型数组。该数组包含9个元素,数值分别为3, 1, 4, 1, 5, 9, 2, 6, 5

3. 排序数组
  • Arrays.sort(data):这是java.util.Arrays类中的静态方法,它使用快速排序算法对数组进行升序排序。data数组在调用该方法后会被原地修改,元素将按从小到大的顺序排列。

  • Arrays.toString(data):将数组转换为字符串格式,方便输出查看数组内容。

排序后的数组为:[1, 1, 2, 3, 4, 5, 5, 6, 9]

4. 查找数组中的某个值
  • searchValue:我们定义了一个变量searchValue,并将其赋值为5,表示我们要在数组中查找的元素。

  • Arrays.binarySearch(data, searchValue)binarySearch方法使用二分查找算法在有序数组中查找指定元素的索引。由于数组已通过Arrays.sort()进行升序排序,因此可以安全地使用此方法查找元素。该方法返回值为元素在数组中的索引位置。

值为5的元素出现在数组的索引5处。注意,若数组未排序,binarySearch()方法可能返回错误结果。

5. 复制数组
  • Arrays.copyOf(data, 12)copyOf方法创建一个新的数组,并将原数组data的内容复制到新数组中。新数组的长度为12(比原数组长),如果新数组的长度大于原数组,未填充部分会使用默认值(对于int类型为0)。

  • extendedData:这是新的扩展数组,原数组内容被复制进来,额外的空间用默认值0填充。

新数组extendedData的前9个元素与原数组data一致,最后3个元素为0

6. 比较数组
  • Arrays.equals(data, anotherArray)equals方法用于比较两个数组的内容是否相同。如果两个数组的长度相同且对应位置的元素完全一致,则返回true,否则返回false

  • anotherArray:我们创建了一个名为anotherArray的新数组,其中包含1, 2, 3三个元素。

由于data数组和anotherArray长度不同,并且元素不完全一致,结果为false

7. 代码总结

这段代码展示了如何利用java.util.Arrays类的多种方法对数组进行操作,包括排序、查找、复制和比较:

  1. 排序Arrays.sort()将数组按升序排序。
  2. 查找Arrays.binarySearch()用于在有序数组中查找元素的位置。
  3. 复制Arrays.copyOf()用于扩展数组,创建一个新的数组并复制原数组的内容。
  4. 比较Arrays.equals()用于比较两个数组是否相等。

通过这些方法,Java开发者能够更加高效地处理数组相关的任务。这些工具提供了方便且高效的解决方案,避免手动编写复杂的算法逻辑。

本地实际运行结果:

Java零基础之数组篇(3):深入掌握Java数组与常用方法!在上一期《Java数组的基本操作》中,我们学习了如何通过索

小结

  通过这期内容的学习,我们掌握了Java中Arrays类提供的常用方法。无论是排序、查找、比较、复制,还是将数组转换为字符串,Arrays类都为我们提供了便捷的解决方案。这些方法不仅让代码更加简洁,还能够显著提升开发效率。

  • 排序:使用Arrays.sort()高效排序,无论是数字还是对象。
  • 查找:通过Arrays.binarySearch()在有序数组中快速定位元素。
  • 比较:使用Arrays.equals()Arrays.deepEquals()判断数组是否相等。
  • 复制与扩展:通过Arrays.copyOf()轻松实现数组扩展。
  • 调试Arrays.toString()Arrays.deepToString()使数组输出变得更加可读。

下期预告

  在下一期内容中,我们将深入探讨Java中的多维数组。多维数组不仅可以表示二维矩阵,还可以用于表示更复杂的数据结构,如三维空间、图像数据等。我们将学习如何声明、初始化、遍历和操作多维数组,并探索不规则数组的使用。敬请期待!

最后

  大家如果觉得看了本文有帮助的话,麻烦给不熬夜崽崽点个三连(点赞、收藏、关注)支持一下哈,大家的支持就是我写作的无限动力。

转载自:https://juejin.cn/post/7413557562926121012
评论
请登录