难度
初级
学习时间
30分钟
适合人群
零基础
开发语言
Java
开发环境
- JDK v11
- IntelliJ IDEA v2018.3
1.默认值
需求:
分别创建8大数据类型和String类型的数组,然后显示输出它们的初始元素。
思路:
- 使用new的方式创建byte、short、int、long、float、double、char、boolean、String类型的数组,长度为3。
- 显示输出它们里面的元素。
实现:
结果:
从运行结果来看,首先程序没报错,说明系统给数组内的成员初始化一个值,这个值就是各大类型的默认值,把运行结果和我们的数据类型的默认对比来看一下就知道了:
完全是一样的。
为什么数组会给元素一个默认值呢?
因为是这样的,我们都知道变量需要初始化才能使用的,这是其一。其二是数组的大小,也就是长度是固定不变的,所以得确定你的空间大小,系统得在内存中给你这个数组预先开辟好空间,让你好存储值。出于这两个因素呢,数组在使用new关键字初始化时,就把内部因素都给初始化了,内部元素初始化的值就是类型的默认值。
2.更改数组中的值
格式:
例如:numbers[0] = 100;
需求:
创建一个整数数组,然后将数组里面的值都赋值为99。
思路:
- 创建一个int类型的数组,长度为3。
- 通过数组下标来更新数组元素。
实现:
结果:
从运行结果来看,正确无误。说明我们要更改数组内元素的值只需通过数组下标赋上新值即可。
3.给数组遍历赋值
需求:
创建一个整数数组,然后将数组里面的值都赋值为99。
思路:
- 创建一个int类型的数组,长度为3。
- 通过数组下标来更新数组元素。
实现:
结果:
从运行结果来看,正确无误。
4.数组的长度是固定不变的
特性:
数组的长度是固定不变的。
验证:
数组的长度是不是固定不变的。
思路:
- 使用new关键字创建一个int类型的数组,长度为3。
- 给下标为9的元素赋值,然后观察数组是添加了新元素。
实现:
结果:
程序出现错误,错误信息:
文字版:
其中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.多个变量指向同一数组
演示:
- 定义一个数组x,长度为3。
- 定义一个数组y等于数组x。
- 修改数组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类型的数组。
- 使用大括号{}初始化数组。
- 使用遍历数组的方式进行排序,先找出最小的,记录其下标,然后将其放置第一个元素的位置上,也就是和下标为0的元素交换位置;再找出第二小的,记录其下标,然后将其放置第二个元素的位置上,也就是和下标为1的元素交换位置。以此类推,我们要找到最后一个最小的,使用和前面同样的方法。
实现:
结果:
运行过程:
上图是代码过程,只展示一次。下面展示每一轮比较的次数和过程。
第一轮比较:
第二轮比较:
第三轮比较:
第四轮比较:
第五轮比较:
数组基础知识总结:
- 数组是一系列相同类型的序列。
- 数组的定义方式一:数据类型 标识符[]
- 数组的定义方式二:数据类型[] 标识符
- 数组的初始化方式一:数据类型[] 标识符 = {元素1,元素2……}
- 数组的初始化方式二:数据类型[] 标识符 = new 数据类型[长度];
- 数组的初始化必须指定长度。
- 数组的长度通过length成员获取。
- 数组的最大下标 = 数组的长度 – 1。
- 数组下标越界异常是ArrayIndexOutOfBoundsException。下标的取值范围在0-最大下标之间,请勿越界。
数组遍历总结
- 数组的遍历也叫数组的迭代。
- 数组的遍历就是按数组下标逐个取出数组中的元素。
- 数组遍历的方式有三种: for循环 、while循环和do-while循环。
- 强烈推荐使用for循环遍历数组。
- 不推荐使用do-while循环遍历数组。
至此,Java中数组详解相关内容讲解先告一段落,更多内容请持续关注。
答疑
如果大家有问题或想了解更多前沿技术,请在下方留言或评论,我会为大家解答。
上一章
下一章
“全栈2019”Java第三十一章:二维数组和多维数组详解
学习小组
加入同步学习小组,共同交流与进步。
- 方式一:关注头条号gorhaf,私信“Java学习小组”。
- 方式二:关注公众号gorhaf,回复“Java学习小组”。
全栈工程师学习计划
关注我们,加入“全栈工程师学习计划”。
版权声明
原创不易,未经允许不得转载!