前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从实例出发,深入探索Java SE中数组的易错点

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

原创
作者头像
喵手
发布2024-02-04 11:04:28
1580
发布2024-02-04 11:04:28
举报
文章被收录于专栏:Java进阶实战Java进阶实战

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

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

  我是一名后端开发爱好者,工作日常接触到最多的就是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腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 摘要
  • 正文
    • 简介
      • 源代码解析
        • 数组的初始化
        • 数组的遍历
        • 数组的越界
      • 应用场景案例
        • 案例1
        • 案例2
      • 优缺点分析
        • 优点
        • 缺点
      • 类代码方法介绍
        • Arrays类
        • System类
      • 测试用例
        • 测试结果
        • 测试代码分析
      • 小结
      • 总结
      • 文末
      相关产品与服务
      腾讯云代码分析
      腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档