哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。
小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!
前言
在Java中,数组是非常常见的数据类型,它可以用来存储一组相同类型的数据。然而,由于数组的特殊性质,我们在使用它的时候也可能会遇到一些易错点,这些问题可能涉及到数组的初始化、遍历、越界等方面。在本文中,我们将通过一些实例来深入探讨Java SE中数组的易错点,希望能够帮助Java开发者更好地理解和使用数组。
摘要
本文主要围绕Java SE中的数组展开讨论,从实例出发,深入探索数组的易错点。涉及的主要内容包括数组的初始化、遍历、越界等方面,我们将通过一些具体的代码实例来说明这些问题,并提供一些优缺点分析和应用场景案例。最后,我们还将提供一些类代码方法介绍和测试用例,帮助读者更好地理解和使用这些知识点。
正文
简介
数组是一种非常重要的数据类型,它可以用来存储一组相同类型的数据。在Java中,数组也是常用的数据类型之一,Java中的数组可以是一维的、二维的、多维的等类型。同时,由于Java数组的特殊性质,我们在使用它的时候也可能会遇到一些易错点,这些问题可能涉及到数组的初始化、遍历、越界等方面。因此,了解Java SE中的数组易错点是非常重要的。
源代码解析
在本节中,我们将通过一些具体的代码实例来说明Java SE中数组的易错点,主要包括数组的初始化、遍历、越界等方面。
数组的初始化
在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 int[5]; 通过关键字new创建了一个包含5个元素的int类型数组arr2,而每个元素默认初始化为0。接着,对arr2数组的每个元素进行赋值,arr2[0] = 1; 表示把第一个元素赋值为1,arr2[1] = 2; 表示把第二个元素赋值为2,以此类推。
总之,数组的初始化方式取决于业务需求,可以根据不同的场景选择合适的方式来初始化数组。
数组的遍历
在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 循环结束。
因此,上述代码的输出结果将是:
1
2
3
4
5
数组的越界
在Java中,数组越界是一个非常容易出现的问题。当我们访问数组的时候,如果超出了数组的范围,就会抛出ArrayIndexOutOfBoundsException异常。
int[] arr = {1, 2, 3, 4, 5};
System.out.println(arr[5]); // 抛出ArrayIndexOutOfBoundsException异常
在上面的代码中,由于数组arr的长度只有5,而我们却访问了它的第6个元素,就导致了数组越界的问题。因此,在使用数组的时候,我们需要非常注意数组的边界条件,避免出现越界问题。
代码分析:
这段代码定义了一个名为arr的整型数组,其中包含了1到5这五个数。然后尝试打印数组中索引为5的元素,但是实际上数组的索引是从0开始的,因此arr[5]的访问超出了数组的范围,会抛出ArrayIndexOutOfBoundsException异常。
应用场景案例
在本节中,我们将根据实际应用场景,提供一些数组的应用案例,以便读者更好地理解和应用数组。
案例1
在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]);
}
在这个例子中,我们使用了冒泡排序算法对数组进行了排序。该算法的基本思想是,从数组的第一个元素开始,依次比较相邻的两个元素,如果前一个元素大于后一个元素,则交换它们的值。通过多次比较和交换,最终可以将数组排序。
代码分析:
这段代码是一个冒泡排序算法的实现。它通过比较相邻两个元素的大小,如果前一个元素大于后一个元素,则交换它们的位置。这样每一趟比较都会将当前最大的元素交换到最后的位置。经过多次比较和交换,最终得到一个按照从小到大排列的数组。
具体解释如下:
-
定义一个数组arr,包含五个元素{5, 3, 1, 2, 4}。
-
第一个for循环:循环变量i从0开始,到arr数组的长度为止。每次循环,都会执行一次第二个for循环。
-
第二个for循环:循环变量j从0开始,到arr数组的长度-1-i为止。每次循环,都会比较两个相邻的元素的大小,如果前一个元素大于后一个元素,则交换它们的位置。
-
第二个for循环的循环次数随着i的增大而减小,因为每经过一次循环,数组的最后一个元素已经是当前最大的元素,不需要再对它进行比较。
-
第二个for循环的结束后,数组中最大的元素已经被交换到了最后的位置。
-
第一个for循环的结束后,整个数组按照从小到大的顺序排列好了。
-
最后一个for循环:循环变量i从0开始,到arr数组的长度为止。每次循环,都会输出数组中的元素。
案例2
在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 次。最后程序输出:
数字1出现了2次
数字2出现了3次
数字3出现了2次
数字4出现了2次
数字5出现了1次
优缺点分析
在本节中,我们将对Java SE中数组的优缺点进行分析,以便读者更好地理解和应用数组。
优点
- 数组可以用来存储一组相同类型的数据,方便读写。
- 数组可以通过下标来访问元素,访问效率较高。
- 数组支持动态扩容和缩容。
缺点
- 数组的长度是固定的,无法动态改变数组的大小。
- 数组中的元素必须是同一类型的,不支持不同类型的元素混合存储。
- 数组的越界问题容易出现,需要特别注意。
类代码方法介绍
在本节中,我们将提供一些Java SE中数组相关的类代码方法介绍,以便读者更好地理解和使用数组。
Arrays类
Arrays类是Java SE中提供的用于操作数组的工具类,它包含了一些静态方法,可以方便地进行数组的操作。
// 将数组转换为字符串
public static String toString(int[] a)
// 对数组进行排序
public static void sort(int[] a)
// 对数组进行二分查找
public static int binarySearch(int[] a, int key)
代码分析:
这三个方法都是Java中Arrays类提供的静态方法,用于操作int类型的数组:
- toString方法将int数组转换为字符串,并返回该字符串。例如:
int[] arr = {1, 2, 3, 4, 5};
String str = Arrays.toString(arr); // str = "[1, 2, 3, 4, 5]"
- sort方法对int数组进行排序。它使用的是快速排序算法,时间复杂度为O(nlogn)。例如:
int[] arr = {5, 3, 1, 2, 4};
Arrays.sort(arr); // arr = {1, 2, 3, 4, 5}
- binarySearch方法对已排序的int数组进行二分查找,如果找到指定key值,则返回其下标;否则返回负数。例如:
int[] arr = {1, 2, 3, 4, 5};
int result = Arrays.binarySearch(arr, 3); // result = 2
result = Arrays.binarySearch(arr, 6); // result = -6(负数表示没找到)
需要注意的是,该方法要求传入的数组必须先进行排序才能进行二分查找。
System类
System类是Java SE中提供的一个用于与系统进行交互的工具类,它包含了一些静态方法,可以在控制台输出信息。
// 将数组打印到控制台
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()方法。
测试用例
在本节中,我们提供一些测试用例,以便读者更好地理解和运用本文中所述测试用例:
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] + "次");
}
}
}
预期输出结果如下:
[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中数组的基本操作,分别包括静态初始化数组、动态初始化数组、遍历数组、数组排序、数组越界和统计数组中数字出现次数。
-
静态初始化数组
定义了一个数组arr1,并通过静态初始化的方式在声明时直接为其赋值,值为{3, 2, 1}。 -
动态初始化数组
定义了一个数组arr2,并通过动态初始化的方式在声明时指定数组长度为5,然后通过循环为数组arr2中每个元素赋值。 -
遍历数组
定义了一个数组arr3,并通过for循环遍历数组,打印出数组中每个元素的值。 -
数组排序
定义了一个数组arr4,并通过Arrays.sort()对数组进行排序,然后通过Arrays.toString()方法将数组转换成字符串进行输出。 -
数组的越界
定义了一个数组arr5,并尝试访问数组中越界的元素arr5[5],由于数组长度为5,访问的下标为5,超过了数组的长度范围,抛出了ArrayIndexOutOfBoundsException异常。 -
统计数组中数字出现次数
定义了一个数组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 !!!
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。