从实例出发,深入探索Java SE中数组的易错点

2024-02-04 11:04:28 浏览数 (1)

哈喽,各位小伙伴们,你们好呀,我是喵手。

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

  在Java中,数组是非常常见的数据类型,它可以用来存储一组相同类型的数据。然而,由于数组的特殊性质,我们在使用它的时候也可能会遇到一些易错点,这些问题可能涉及到数组的初始化、遍历、越界等方面。在本文中,我们将通过一些实例来深入探讨Java SE中数组的易错点,希望能够帮助Java开发者更好地理解和使用数组。

摘要

  本文主要围绕Java SE中的数组展开讨论,从实例出发,深入探索数组的易错点。涉及的主要内容包括数组的初始化、遍历、越界等方面,我们将通过一些具体的代码实例来说明这些问题,并提供一些优缺点分析和应用场景案例。最后,我们还将提供一些类代码方法介绍和测试用例,帮助读者更好地理解和使用这些知识点。

正文

简介

  数组是一种非常重要的数据类型,它可以用来存储一组相同类型的数据。在Java中,数组也是常用的数据类型之一,Java中的数组可以是一维的、二维的、多维的等类型。同时,由于Java数组的特殊性质,我们在使用它的时候也可能会遇到一些易错点,这些问题可能涉及到数组的初始化、遍历、越界等方面。因此,了解Java SE中的数组易错点是非常重要的。

源代码解析

  在本节中,我们将通过一些具体的代码实例来说明Java SE中数组的易错点,主要包括数组的初始化、遍历、越界等方面。

数组的初始化

  在Java中,数组可以通过两种方式进行初始化,一种是静态初始化,一种是动态初始化。

代码语言:java复制
// 静态初始化
int[] arr1 = {1, 2, 3, 4, 5};

// 动态初始化
int[] arr2 = new int[5];
arr2[0] = 1;
arr2[1] = 2;
arr2[2] = 3;
arr2[3] = 4;
arr2[4] = 5;

  在静态初始化中,我们在定义数组的同时就可以初始化它的元素。而在动态初始化中,我们需要先定义一个数组,然后再依次为每个元素赋值。需要注意的是,静态初始化和动态初始化不能同时使用。

代码分析:

  这段代码是关于Java数组的初始化的示例。其中,数组可以通过静态初始化和动态初始化两种方式进行。

静态初始化是指在创建数组对象的同时,为其元素赋值的方式。比如 int[] arr1 = {1, 2, 3, 4, 5}; 创建了一个包含5个元素的int类型数组arr1,并给其元素赋值为1、2、3、4和5。

动态初始化则是指在创建数组对象之后,通过索引为其元素赋值的方式。比如 int[] arr2 = new int5; 通过关键字new创建了一个包含5个元素的int类型数组arr2,而每个元素默认初始化为0。接着,对arr2数组的每个元素进行赋值,arr20 = 1; 表示把第一个元素赋值为1,arr21 = 2; 表示把第二个元素赋值为2,以此类推。

总之,数组的初始化方式取决于业务需求,可以根据不同的场景选择合适的方式来初始化数组。

数组的遍历

  在Java中,我们可以通过循环语句来遍历数组。

代码语言:java复制
int[] arr = {1, 2, 3, 4, 5};
for (int i = 0; i < arr.length; i  ) {
    System.out.println(arr[i]);
}

  这段代码中,我们使用了for循环来遍历了数组arr的所有元素,输出了它们的值。需要注意的是,在使用for循环遍历数组时,我们需要使用数组的length属性来获取数组的长度。

代码分析:

  上述代码是一个 Java 程序片段,它创建了一个整型数组 arr,包含了 1 到 5 五个元素。然后使用 for 循环遍历了该数组,将每个元素打印出来。

  具体来说,for 循环的初始化语句 i = 0 将变量 i 初始化为 0。循环条件 i < arr.length 表示只要 i 小于数组长度,就执行循环体。循环体里使用了 System.out.println() 方法将数组元素按顺序打印出来。在每次循环迭代时,i 将自增 1,直到 i 等于数组长度,for 循环结束。

  因此,上述代码的输出结果将是:

代码语言:java复制
    1
    2
    3
    4
    5

数组的越界

  在Java中,数组越界是一个非常容易出现的问题。当我们访问数组的时候,如果超出了数组的范围,就会抛出ArrayIndexOutOfBoundsException异常。

代码语言:java复制
int[] arr = {1, 2, 3, 4, 5};
System.out.println(arr[5]); // 抛出ArrayIndexOutOfBoundsException异常

  在上面的代码中,由于数组arr的长度只有5,而我们却访问了它的第6个元素,就导致了数组越界的问题。因此,在使用数组的时候,我们需要非常注意数组的边界条件,避免出现越界问题。

代码分析:

  这段代码定义了一个名为arr的整型数组,其中包含了1到5这五个数。然后尝试打印数组中索引为5的元素,但是实际上数组的索引是从0开始的,因此arr5的访问超出了数组的范围,会抛出ArrayIndexOutOfBoundsException异常。

应用场景案例

  在本节中,我们将根据实际应用场景,提供一些数组的应用案例,以便读者更好地理解和应用数组。

案例1

  在Java中,我们可以使用数组来存储一组数据,并进行排序。下面的代码是一个使用数组进行排序的例子。

代码语言:java复制
int[] arr = {5, 3, 1, 2, 4};
for (int i = 0; i < arr.length; i  ) {
    for (int j = 0; j < arr.length - 1 - i; j  ) {
        if (arr[j] > arr[j   1]) {
            int tmp = arr[j];
            arr[j] = arr[j   1];
            arr[j   1] = tmp;
        }
    }
}
for (int i = 0; i < arr.length; i  ) {
    System.out.println(arr[i]);
}

  在这个例子中,我们使用了冒泡排序算法对数组进行了排序。该算法的基本思想是,从数组的第一个元素开始,依次比较相邻的两个元素,如果前一个元素大于后一个元素,则交换它们的值。通过多次比较和交换,最终可以将数组排序。

代码分析:

  这段代码是一个冒泡排序算法的实现。它通过比较相邻两个元素的大小,如果前一个元素大于后一个元素,则交换它们的位置。这样每一趟比较都会将当前最大的元素交换到最后的位置。经过多次比较和交换,最终得到一个按照从小到大排列的数组。

具体解释如下:

  1. 定义一个数组arr,包含五个元素{5, 3, 1, 2, 4}。
  2. 第一个for循环:循环变量i从0开始,到arr数组的长度为止。每次循环,都会执行一次第二个for循环。
  3. 第二个for循环:循环变量j从0开始,到arr数组的长度-1-i为止。每次循环,都会比较两个相邻的元素的大小,如果前一个元素大于后一个元素,则交换它们的位置。
  4. 第二个for循环的循环次数随着i的增大而减小,因为每经过一次循环,数组的最后一个元素已经是当前最大的元素,不需要再对它进行比较。
  5. 第二个for循环的结束后,数组中最大的元素已经被交换到了最后的位置。
  6. 第一个for循环的结束后,整个数组按照从小到大的顺序排列好了。
  7. 最后一个for循环:循环变量i从0开始,到arr数组的长度为止。每次循环,都会输出数组中的元素。

案例2

  在Java中,我们可以使用数组来统计一些数据的出现次数。下面的代码是一个使用数组统计数据出现次数的例子。

代码语言:java复制
int[] arr = {1, 2, 3, 4, 5, 2, 3, 4, 1, 2};
int[] count = new int[6];
for (int i = 0; i < arr.length; i  ) {
    count[arr[i]]  ;
}
for (int i = 1; i < count.length; i  ) {
    System.out.println("数字"   i   "出现了"   count[i]   "次");
}

  在这个例子中,我们定义了一个长度为6的数组count,用来记录数字1到5的出现次数。通过遍历原始数组arr,我们可以依次将每个数字出现的次数记录在count数组中。最后,我们再遍历count数组,输出每个数字出现的次数。

代码分析:

  该段代码目的是统计一个给定整数数组中每个数字出现的次数。首先定义了一个给定整数数组 arr,然后创建了一个长度为 6(因为最大的数字是 5)的整型数组 count,然后使用 for 循环遍历整数数组 arr,对于每个数字,将count 数组中对应的数字位置加 1。最后再使用 for 循环遍历 count 数组,输出每个数字出现的次数。

  例如,对于给定整数数组 {1, 2, 3, 4, 5, 2, 3, 4, 1, 2},count 数组在遍历后的值为 {0, 2, 3, 2, 2, 1},表示数字 1 出现了 2 次,数字 2 出现了 3 次,数字 3 出现了 2 次,数字 4 出现了 2 次,数字 5 出现了 1 次。最后程序输出:

代码语言:java复制
数字1出现了2次

数字2出现了3次

数字3出现了2次

数字4出现了2次

数字5出现了1次

优缺点分析

  在本节中,我们将对Java SE中数组的优缺点进行分析,以便读者更好地理解和应用数组。

优点

  • 数组可以用来存储一组相同类型的数据,方便读写。
  • 数组可以通过下标来访问元素,访问效率较高。
  • 数组支持动态扩容和缩容。

缺点

  • 数组的长度是固定的,无法动态改变数组的大小。
  • 数组中的元素必须是同一类型的,不支持不同类型的元素混合存储。
  • 数组的越界问题容易出现,需要特别注意。

类代码方法介绍

  在本节中,我们将提供一些Java SE中数组相关的类代码方法介绍,以便读者更好地理解和使用数组。

Arrays类

  Arrays类是Java SE中提供的用于操作数组的工具类,它包含了一些静态方法,可以方便地进行数组的操作。

代码语言:java复制
// 将数组转换为字符串
public static String toString(int[] a)

// 对数组进行排序
public static void sort(int[] a)

// 对数组进行二分查找
public static int binarySearch(int[] a, int key)

代码分析:

  这三个方法都是Java中Arrays类提供的静态方法,用于操作int类型的数组:

  1. toString方法将int数组转换为字符串,并返回该字符串。例如:

<!---->

代码语言:java复制
    int[] arr = {1, 2, 3, 4, 5};
    String str = Arrays.toString(arr); // str = "[1, 2, 3, 4, 5]"
  1. sort方法对int数组进行排序。它使用的是快速排序算法,时间复杂度为O(nlogn)。例如:<!----> int[] arr = {5, 3, 1, 2, 4}; Arrays.sort(arr); // arr = {1, 2, 3, 4, 5}<!----> int[] arr = {1, 2, 3, 4, 5}; int result = Arrays.binarySearch(arr, 3); // result = 2 result = Arrays.binarySearch(arr, 6); // result = -6(负数表示没找到)需要注意的是,该方法要求传入的数组必须先进行排序才能进行二分查找。
  2. binarySearch方法对已排序的int数组进行二分查找,如果找到指定key值,则返回其下标;否则返回负数。例如:

System类

  System类是Java SE中提供的一个用于与系统进行交互的工具类,它包含了一些静态方法,可以在控制台输出信息。

代码语言:java复制
// 将数组打印到控制台
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

代码分析:

  该代码中的arraycopy方法是Java中的数组复制方法,其参数含义如下:

  • src:源数组
  • srcPos:源数组的起始位置
  • dest:目标数组
  • destPos:目标数组的起始位置
  • length:要复制的数组元素的数量

  该方法的作用是将源数组从指定位置开始的length个元素复制到目标数组的指定位置开始的length个位置上。如果目标数组比源数组小,则只会复制部分元素;如果目标数组比源数组大,则会先将目标数组中的元素全部清空,然后再复制源数组的元素。

  该方法在控制台上并不会直接打印数组,而是用于将一个数组中的元素复制到另一个数组中。如果需要打印数组到控制台,可以使用Java中的Arrays类的toString()方法。

测试用例

在本节中,我们提供一些测试用例,以便读者更好地理解和运用本文中所述测试用例:

代码语言:java复制
package com.example.javase.se.array;

import java.util.Arrays;

/**
 * @Author ms
 * @Date 2023-11-14 21:11
 */
public class ArrayTest10 {

    public static void main(String[] args) {
        // 静态初始化数组
        int[] arr1 = {3, 2, 1};
        System.out.println(Arrays.toString(arr1));

        // 动态初始化数组
        int[] arr2 = new int[5];
        for (int i = 0; i < arr2.length; i  ) {
            arr2[i] = i   1;
        }
        System.out.println(Arrays.toString(arr2));

        // 遍历数组
        int[] arr3 = {1, 2, 3, 4, 5};
        for (int i = 0; i < arr3.length; i  ) {
            System.out.println(arr3[i]);
        }

        // 数组排序
        int[] arr4 = {5, 3, 1, 2, 4};
        Arrays.sort(arr4);
        System.out.println(Arrays.toString(arr4));

        // 数组的越界
        int[] arr5 = {1, 2, 3, 4, 5};
        try {
            System.out.println(arr5[5]); // 访问越界元素
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("数组越界");
        }

        // 统计数组中数字出现次数
        int[] arr6 = {1, 2, 3, 4, 5, 2, 3, 4, 1, 2};
        int[] count = new int[6];
        for (int i = 0; i < arr6.length; i  ) {
            count[arr6[i]]  ;
        }
        for (int i = 1; i < count.length; i  ) {
            System.out.println("数字"   i   "出现了"   count[i]   "次");
        }
    }
}

预期输出结果如下:

代码语言:java复制
    [3, 2, 1]
    [1, 2, 3, 4, 5]
    1
    2
    3
    4
    5
    [1, 2, 3, 4, 5]
    数组越界
    数字1出现了2次
    数字2出现了3次
    数字3出现了2次
    数字4出现了2次
    数字5出现了1次

测试结果

  根据如上测试用例,本地测试结果如下,仅供参考,你们也可以自行修改测试用例或者添加更多的测试数据或测试方法,进行熟练学习以此加深理解。

测试代码分析

  根据如上测试用例,在此我给大家进行深入详细的解读一下测试代码,以便于更多的同学能够理解并加深印象。

  该代码演示了Java中数组的基本操作,分别包括静态初始化数组、动态初始化数组、遍历数组、数组排序、数组越界和统计数组中数字出现次数。

  1. 静态初始化数组 定义了一个数组arr1,并通过静态初始化的方式在声明时直接为其赋值,值为{3, 2, 1}。
  2. 动态初始化数组 定义了一个数组arr2,并通过动态初始化的方式在声明时指定数组长度为5,然后通过循环为数组arr2中每个元素赋值。
  3. 遍历数组 定义了一个数组arr3,并通过for循环遍历数组,打印出数组中每个元素的值。
  4. 数组排序 定义了一个数组arr4,并通过Arrays.sort()对数组进行排序,然后通过Arrays.toString()方法将数组转换成字符串进行输出。
  5. 数组的越界 定义了一个数组arr5,并尝试访问数组中越界的元素arr55,由于数组长度为5,访问的下标为5,超过了数组的长度范围,抛出了ArrayIndexOutOfBoundsException异常。
  6. 统计数组中数字出现次数 定义了一个数组arr6,并定义了一个长度为6的count数组,用于保存数字出现的次数。通过for循环将arr6中每个数字出现的次数记录在count数组中,最后再次通过for循环遍历count数组,输出每个数字出现的次数。

小结

  本文针对Java SE中数组的易错点进行了深入探讨,并提供了一些实例、应用场景案例、优缺点分析、类代码方法介绍和测试用例,希望能够帮助Java开发者更好地理解和使用数组。在本文中,我们从静态初始化、动态初始化、遍历、越界等多个方面阐述了Java数组的易错点,并提供了一些优缺点分析和应用场景案例。此外,我们还介绍了一些Java SE中数组相关的类代码方法,并提供了一些测试用例来帮助读者更好地理解和运用本文所述内容。总之,通过本文的学习,希望读者能够掌握Java中的数组相关知识,并能够在实际开发中运用自如,达到事半功倍的效果。

总结

  本文主要介绍了Java SE中数组的易错点,主要包括数组的初始化、遍历、越界等方面。通过具体的代码实例,深入探讨了数组的特殊性质和注意点,并提供了一些优缺点分析和应用场景案例。此外,还介绍了一些Java SE中数组相关的类代码方法和测试用例,帮助读者更好地理解和运用本文中所述的内容。

  总的来说,Java SE中的数组是非常常见和重要的数据类型,但也存在一些易错点,需要特别注意。通过本文的学习,读者可以更好地理解和使用Java SE中的数组。

... ...

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

... ...

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!

***

⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

我正在参与我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

0 人点赞