困难
基本的
学习时间
30分钟
适合人群
零基础
开发语言
爪哇
开发环境 1. 默认值
需要:
分别创建8种数据类型和String类型的数组,然后显示输出它们的初始元素。
想法:
使用new创建byte、short、int、long、float、double、char、boolean、String类型的数组,长度为3,显示其中的元素。
完成:
结果:
从运行结果来看,首先程序没有报错,说明系统为数组中的成员初始化了一个值。 该值是每种类型的默认值。 对比一下运行结果和我们数据类型的默认值,你就会知道:
完全一样。
为什么数组要给元素一个默认值?
正因为如此,我们都知道变量在使用之前需要先进行初始化,这就是其中之一。 其次是数组的大小,也就是长度是固定的,所以你必须确定你的空间大小,系统必须在内存中为这个数组预先分配空间给你存储值。 对于这两个因子,当用new关键字初始化数组时,所有的内部因子都被初始化,内部元素的初始化值为该类型的默认值。
2.改变数组中的值
格式:
例如:数字[0] = 100;
需要:
创建一个整数数组,并将数组中的值赋给99。
想法:
创建一个长度为 3 的 int 类型数组。通过数组下标更新数组元素。
完成:
结果:
从运行结果来看,是正确的。 说明一下,如果我们要改变数组中元素的值,只需要通过数组下标赋值一个新的值即可。
3.给数组遍历赋值
需要:
创建一个整数数组,并将数组中的值赋给99。
想法:
创建一个长度为 3 的 int 类型数组。通过数组下标更新数组元素。
完成:
结果:
从运行结果来看,是正确的。
4.数组长度固定
特征:
数组的长度是固定的。
核实:
数组的长度不固定。
想法:
使用new关键字创建一个长度为3的int类型数组,给下标为9的元素赋值,然后观察数组中新增了一个元素。
完成:
结果:
程序出现错误,错误信息:
文字版:
线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException:索引 9 超出长度 3 的范围
其中ArrayIndexOutOfBoundsException之前出现过,数组下标越界异常。 说明我们不仅没有添加新元素,还出现了数组下标越界异常。
确认了“数组长度固定”的性质。
5. 对数组的引用
我们先来看一下数据类型的分类:
其中,基本的数据类型之前都学过。 现在让我们开始使用引用数据类型。
什么是引用?
在什么是引用之前,我们先简单了解一下,Java为了存放局部变量和成员变量,在内存中开辟了若干空间。 其中,有两个空间和我们的变量密切相关,一个叫做“栈内存”,一个叫做“堆内存”:
当我们定义一个局部变量时,比如int x = 3; Java会在栈内存中开辟空间:
当我们使用new关键字定义一个变量时,比如int[] arr = new int[3]; Java会在堆内存中开辟空间,为对象分配一个内存地址,然后栈内存中的变量会指向堆内存中的内存地址:
我们可以看到变量x后面直接跟着变量值,变量arr指向数组的首地址。
演示:
用于定义一个数组x,用new关键字初始化,长度为3。显示输出数组x变量,而不是输出数组中的元素。
完成:
结果:
从运行结果来看,“[I@566776ad”是什么意思?
[:表示该对象是一个数组
I:表示数组类型为int类型
566776ad:内存地址
在内存地址前加上“@”符号就是“[I@566776ad”。
之所以能输出“[I@566776ad”,是因为每个对象都有一个toString方法。 至于toString方法的解释,在后续文章中有详细的解释。
6.多个变量指向同一个数组
演示:
定义一个长度为 3 的数组 x。定义一个等于数组 x 的数组 y。 修改数组y第一个元素的值为99,分别打印数组x和数组y。
完成:
结果:
工作流程:
第一步,创建数组 x:
第二步是创建一个数组 y 并将数组 x 赋值给 y:
这一步执行后,变量x和变量y同时指向一个数组。
第三步,修改数组y的第一个元素为99:
这一步执行完后,数组第一个元素的值已经变成了99,应该可以清楚的看到堆内存中只有一个数组,变量x和y同时指向这个数组,所以x[0]和y[0]的值都是99。
7.数组复制
我们知道,如果创建一个数组x,然后将数组x赋值给数组y,这不叫复制数组。 这称为指向同一个数组对象的多个变量。 而我们要做的是将数组 x 完全复制到数组 y 中。
需要:
有一个数组,有五个元素,分别是数字 1-5,请将这个数组完整地复制到另一个数组中。
想法:
创建数组 x。 因为元素值已知,所以使用花括号{}来初始化方法。 使用遍历的方法将数组x的所有元素复制到新的数组y中。
完成:
结果:
从运行结果来看,我们成功分配了数组。
我们还有一个更方便的方法,就是调用System.arraycopy方法来完成对数组的赋值。
完成:
结果:
从运行结果来看,复制数组是完全正确的。
System.arraycopy方法原型:
删除说明:
有几个参数要说:
src:源数组。
srcPos:源数组中的起始位置。
dest:目标数组。
destPos:目标数组中的起始位置。
length:要复制的数组元素的数量。
再看看我们实现中写的代码:
源数组为x,目的数组为y,从数组x的下标0取值,接收值的数组y从下标0接收值,待取数组元素个数复制的是数组 x 的长度。
8.数组排序
需要:
将数字11、3、25、7、10、5存入数组,然后从小到大排序。
想法:
声明一个 int 类型的数组。 数组使用大括号 {} 进行初始化。 使用遍历数组的方法排序,先找到最小的,记录下它的下标java输出数组,然后放在第一个元素的位置上,即和下标为0的元素交换位置; 然后找到次小的,记录下它的下标,然后放在第二个元素的位置上,也就是和下标为1的元素交换位置。以此类推java输出数组,我们要找最后一个最小的,用同样的方法同前。
完成:
结果:
工作流程:
上图是代码流程,只展示了一次。 每轮比对的次数和过程如下图所示。
第一轮对比:
第二轮对比:
第三轮对比:
第四轮对比:
第五轮比较:
数组基础知识总结:数组遍历总结
至此,Java中数组详解的讲解就告一段落了,更多内容请继续关注。
回答提问