文章目录
从零开始的Java学习生活(9)
在上文中,我们详细讲解了Java中的循环语句以及循环语句中会用到的关键字,本篇文章我们将学习了解一个新的知识点——数组。(ps:实现声明,本文章中不涉及内存、地址等知识的具体讲解大家先有个大概的印象,这些知识会在以后出单章单独讲解。)
一、数组是什么?
数组是一种特殊的数据类型,这种数据类型用于存储一组数据类型相同的数据。简单来说,数组就是一个容器,用于存储一组数据,这组数据具有相同的数据类型。
数组中的每个数据称为数组的元素。
举个栗子:你现在正在军训,你的教官已经排好了队形,并且他想知道每个位置对应的同学的名字,并且之后可能会对对某几个同学的位置进行调整。现在他把这个任务交给你,你如果想用java来实现教官的要求,你应该怎么办呢?
一行一行把所有同学的名字按顺序输出?那如果我某些同学进行换位置,我是不是还需要再回到之前的输出语句中一行一行的找到这些同学所在的位置,再对他们进行调换。是不是很麻烦?这时候你突然想到,既然我是按照行列站好的,那我不是可以通过他们的坐标(例如:第三行第四列(3,4))来进行快速的查找和更改呢?想要实现这个想法需要用到的就是我们今天要学习的数组了。
1.数组的特点
数组具有2个特点:
- 数组中的元素具有相同的数据类型。
- 数组的容量是确定的。—创建数组的时候确定其容量。
ps:数组本身是一个引用数据类型,存储的元素一般为基本数据类型(忘了的同学回去翻之前的文章哦)。
2.为什么要使用数组
使用数组有以下原因:
-
简化代码:数组能存储一组数据,因此可以将多个变量合为一个变量。
表示一组数据,可以定义多个变量,但是代码量大。使用数组的话,只需要一个变量就能存储一组数据。
-
便于批量操作数据:数组和循环经常搭配使用,通过循环可以操作每一个数据。
例如:有一组订单,现在需要对订单按天进行统计销售额。可以使用一个循环,遍历每一个订单,属于同一天的订单进行求和。
如果每个订单都用一个变量保存的话,就没有办法使用循环进行操作。
-
很多场景都要用到数组。
二、如何定义数组
数组的定义格式:
格式一: 数据类型[] 变量名
例如: int[] ages
含义:定义一个整型数组,数组的名字叫ages。
格式二: 数据类型 变量名[]
例如: int ages[]
含义:定义一个整型数组,数组的名字叫ages。
推荐使用格式一。1. 便于理解;2.很多程序员都在使用格式一,便于阅读彼此的代码
格式二是为了兼容C语言的写法,便于C程序员转型为Java程序员。
三、数组的初始化
之前的课程讲过变量定义的三要素:数据类型 、变量名、初始值。
数组是一种数据类型,在定义数组变量的时候,也要为其指定初始值。数组的初始值指的是数组中每个元素的初始值。
数组的初始化分为2种:动态初始化 和 静态初始化。
1. 动态初始化
动态初始化:在初始化数组时,只指定数组长度,由系统为其分配初始值。
数组长度:数组所能容纳的元素的个数。
数组元素的默认初始值如下图:
动态初始化格式:
数据类型[] 变量名 = new 数据类型[数组长度];
示例:
int[] ages = new int[10];
上述代码表示我们定义了一个名字叫ages的数组,这个数组存储的元素的数据类型为int,最大可以存储10个int元素。
因为我们使用的new这个动态初始化关键字,所以这时候数组中每个元素的值都为默认值0;(动态初始化内存分配等数据结构知识我会在学明白了之后一起出个番外篇发出来qwq)
2. 静态初始化
静态初始化:初始化数组时,人为指定每个元素的值。
格式一:
数据类型[] 变量名 = new 数据类型[]{数据1,数据2,数据3,…};
格式一
示例:
int[] ages = new int[]{3, 4, 4, 3, 2, 4, 3, 4, 3, 3};
等号左边没有什么变化,主要是右边。右边大括号内按照顺序依次表示ages数组中每个元素的初始值。
格式二:-----格式二是格式1的简化格式,通常使用这种格式。
数据类型[] 变量名 = {数据1, 数据2, 数据3,…};
格式二示例:
int[] ages = {3, 4, 4, 3, 2, 4, 3, 4, 3, 3}
四、数组的访问
数组的访问包括:数组的访问、数组元素的访问。
(1)数组的访问
数组在内存中是一段连续的内存区域。
数组名是一个变量,但是它不存储具体数据,存储的是这段连续内存区域的起始地址(也叫首地址)。
数组名代表的是整个数组,不代表数组中的元素。
数组变量的访问方式:数组名
在打印数组变量的时候,会打印出数组所存储的内存地址,如下图所示。
(2)数组元素的访问
格式:数组名[索引]
索引指的是数据的序号(编号),通常也称为数组的下标。在Java中数组下标是从0开始的。即第1个数据下标为0,第2个数据下标为1,第3个数据下标为2,…
数组名[索引] 等同于一个变量,是一种特殊的变量名。
索引的最小值是:0,索引的最大值是:元素个数 - 1
数组元素的访问包括:给数组元素的赋值、使用数组元素的值。
(3)使用数组元素
大家想一下我们刚才说到的队列问题,我们是不是要先给站好队的每一个同学一个编号。这里用到的方法是给数组元素赋值;接下来我们如果要让他们从前到后依次报数,就需要用到输出数组元素的值得方法。
看两个代码示例:
- 给数组元素赋值
public static void main(String[] args) {
int[] ages = {3, 4, 3, 2, 5};
System.out.println(ages[0]);
ages[0] = 7;//此处将ages[0]的值赋值为7,会覆盖原有的3
System.out.println(ages[0]);
}
2.使用数组元素的值
public static void main(String[] args) {
int[] ages = {3, 4, 3, 2, 5};
System.out.println(ages[0]);
ages[0] = 7;//此处将ages[0]的值赋值为7
System.out.println(ages[0]);
int num = ages[1];//将ages[1]赋值给变量num
int sum = ages[2] + ages[3];//将ages[2]于ages[3]的和赋值给sum
System.out.println(num);
System.out.println(sum);
}
(4)数组访问总结
- 数组名代表的是整个数组,存储的是数组的起始地址。
- 数组元素是数组中真正的数据,数组元素的访问方式是 数组名[索引]
- 索引的最小值是:0,最大值是:元素个数-1
五、数组操作的注意事项
(1)数组下标越界
数组下标越界:指的是数组下标的值超出了下标的取值范围。
数组下标的取值范围:0 ~ 数组个数 - 1
例如:
int[] arr = new int[3];
System.out.println(arr);
System.out.println(arr[3]);//此处会产生数组越界问题。数组下标的取值范围是[0, 2],但访问了下标为3的元素。
上面代码运行后,会出现如下结果:
图中报出了一个异常(Exception),异常的意思是数组的索引超出了边界。下标3超出了下标的范围。简单说就是数组的下标越界。
(2)空指针异常
null是一个常量,用于给引用类型变量赋值。
空指针异常:指的是数组(或对象)指向了一个空地址,如果指向了空地址以后,还在继续访问数据,就会出现空指针异常。
>
```java
public static void main(String[] args) {
int[] arr = new int[3];
System.out.println(arr);//例如: arr的值是15db9742
arr = null;// 将arr设置为null,即空值(内存地址为0的值)
System.out.println(arr);// null
System.out.println(arr[0]); //空指针异常
}
运行结果为:
总结
好的我们本篇文章就讲到这里,本章我们初步了解了数组的结构和简单的元素赋值使用操作,下一篇我们将深入对数组的学习,了解更多数组的使用方法(如:增删改查)。想要深入了解数组底层的同学们也不要急,我过段时间会专门出数据结构的番外(等我先学明白了,-_-||),谢谢大家。