您的位置 首页 java

“全栈2019”Java第三十章:数组详解(下篇)

难度

初级

学习时间

30分钟

适合人群

零基础

开发语言

Java

开发环境

  • JDK v11
  • IntelliJ IDEA v2018.3

1.默认值

需求:

分别创建8大数据类型和String类型的数组,然后显示输出它们的初始元素。

思路:

  1. 使用new的方式创建byte、short、int、long、float、double、char、boolean、String类型的数组,长度为3。
  2. 显示输出它们里面的元素。

实现:

结果:

从运行结果来看,首先程序没报错,说明系统给数组内的成员初始化一个值,这个值就是各大类型的默认值,把运行结果和我们的数据类型的默认对比来看一下就知道了:

完全是一样的。

为什么数组会给元素一个默认值呢?

因为是这样的,我们都知道变量需要初始化才能使用的,这是其一。其二是数组的大小,也就是长度是固定不变的,所以得确定你的空间大小,系统得在内存中给你这个数组预先开辟好空间,让你好存储值。出于这两个因素呢,数组在使用new关键字初始化时,就把内部因素都给初始化了,内部元素初始化的值就是类型的默认值。

2.更改数组中的值

格式:

例如:numbers[0] = 100;

需求:

创建一个整数数组,然后将数组里面的值都赋值为99。

思路:

  1. 创建一个int类型的数组,长度为3。
  2. 通过数组下标来更新数组元素。

实现:

结果:

从运行结果来看,正确无误。说明我们要更改数组内元素的值只需通过数组下标赋上新值即可。

3.给数组遍历赋值

需求:

创建一个整数数组,然后将数组里面的值都赋值为99。

思路:

  1. 创建一个int类型的数组,长度为3。
  2. 通过数组下标来更新数组元素。

实现:

结果:

从运行结果来看,正确无误。

4.数组的长度是固定不变的

特性:

数组的长度是固定不变的。

验证:

数组的长度是不是固定不变的。

思路:

  1. 使用new关键字创建一个int类型的数组,长度为3。
  2. 给下标为9的元素赋值,然后观察数组是添加了新元素。

实现:

结果:

程序出现错误,错误信息:

文字版:

其中ArrayIndexOutOfBoundsException之前出现过,数组下标越界异常。说明我们不但没有把新元素加上去,而且还出现数组下标越界异常。

证实了“数组长度是固定不变的”这一特性。

5.数组的引用

我们先来看一下数据类型的分类:

其中,基本数据类型前面都学完了。现在开始接触引用数据类型。

什么是引用?

在说什么是引用之前,我们先简单了解一下Java为了存储局部变量和成员变量,在内存中开辟了几块空间。其中,有两块空间是和我们变量息息相关的,一个叫“栈内存”,一个叫“ 堆内存 ”:

当我们定义一个局部变量的时候,比如int x = 3;Java就会在栈内存中开辟空间:

当我们使用new关键字定义一个变量时,比如int[] arr = new int[3];Java就会在堆内存中开辟空间,并且给对象分配内存地址,然后栈内存中的变量就指向堆内存中的内存地址:

我们可以看到变量x后面直接跟的就是变量值,而变量arr指向的是数组的首地址。

演示:

  1. 使用定义一个数组x,使用new关键字初始化,长度为3。
  2. 显示输出数组x变量,不是显示输出数组里面的元素。

实现:

结果:

从运行结果来看,“[I@566776ad”这是什么意思呢?

[:表示该对象是数组

I:表示数组类型是int类型

566776ad:内存地址

在内存地址前面加上“@”符号合起来就是“[I@566776ad”。

之所以能输出“[I@566776ad”,是因为每个对象都有一个 toString 方法。至于toString方法的讲解后续文章有详解。

6.多个变量指向同一数组

演示:

  1. 定义一个数组x,长度为3。
  2. 定义一个数组y等于数组x。
  3. 修改数组y的第一个元素的值为99。
  4. 分别打印数组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五个元素,请将此数组完完整整复制到另外一个数组。

思路:

  1. 创建数组x。
  2. 因为已经知道元素值,所以使用大括号{}初始化方法。
  3. 使用遍历方法复制数组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这几个数字存储到数组中,然后将其按从小到大排序。

思路:

  1. 声明一个int类型的数组。
  2. 使用大括号{}初始化数组。
  3. 使用遍历数组的方式进行排序,先找出最小的,记录其下标,然后将其放置第一个元素的位置上,也就是和下标为0的元素交换位置;再找出第二小的,记录其下标,然后将其放置第二个元素的位置上,也就是和下标为1的元素交换位置。以此类推,我们要找到最后一个最小的,使用和前面同样的方法。

实现:

结果:

运行过程:

上图是代码过程,只展示一次。下面展示每一轮比较的次数和过程。

第一轮比较:

第二轮比较:

第三轮比较:

第四轮比较:

第五轮比较:

数组基础知识总结:

  • 数组是一系列相同类型的序列。
  • 数组的定义方式一:数据类型 标识符[]
  • 数组的定义方式二:数据类型[] 标识符
  • 数组的初始化方式一:数据类型[] 标识符 = {元素1,元素2……}
  • 数组的初始化方式二:数据类型[] 标识符 = new 数据类型[长度];
  • 数组的初始化必须指定长度。
  • 数组的长度通过length成员获取。
  • 数组的最大下标 = 数组的长度 – 1。
  • 数组下标越界异常是ArrayIndexOutOfBoundsException。下标的取值范围在0-最大下标之间,请勿越界。

数组遍历总结

  • 数组的遍历也叫数组的迭代。
  • 数组的遍历就是按数组下标逐个取出数组中的元素。
  • 数组遍历的方式有三种: for循环 、while循环和do-while循环。
  • 强烈推荐使用for循环遍历数组。
  • 不推荐使用do-while循环遍历数组。

至此,Java中数组详解相关内容讲解先告一段落,更多内容请持续关注。

答疑

如果大家有问题或想了解更多前沿技术,请在下方留言或评论,我会为大家解答。

上一章

下一章

“全栈2019”Java第三十一章:二维数组和多维数组详解

学习小组

加入同步学习小组,共同交流与进步。

  • 方式一:关注头条号gorhaf,私信“Java学习小组”。
  • 方式二:关注公众号gorhaf,回复“Java学习小组”。

全栈工程师学习计划

关注我们,加入“全栈工程师学习计划”。

版权声明

原创不易,未经允许不得转载!

文章来源:智云一二三科技

文章标题:“全栈2019”Java第三十章:数组详解(下篇)

文章地址:https://www.zhihuclub.com/180518.shtml

关于作者: 智云科技

热门文章

网站地图