当前位置: 首页 > news >正文

[Java · 铢积寸累] 数据结构 — 数组类型 - 概念引入

🌟 想系统化学习 Java 编程?看看这个:[编程基础] Java · 学习手册

0x01:数组类型 — 概念引入

我们以一个需求,来导入 Java 的数组类型。比如录入 5 个学生的成绩,并求其平均值,我们可以这样写:

import java.util.Scanner;
​
public class TestVar {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int total = 0; // 总分for (int i = 0; i < 5; i++) {System.out.print("请录入第 " + (i + 1) + " 个学生的成绩: ");total +=sc.nextInt();}System.out.println("5 名学生的平均分为: " + (total / 5));}
}

OK,平均值是能求了,那么我想知道第 3 个学生的成绩是多少,你能给我输出出来吗?还不能吧。所以这就引出了本章我们将要介绍的数据类型 ”数组“,它就可以帮我们存储每个学生的具体的成绩。

0x02:数组类型 — 概念解析

数组是指一组类型相同的数据的有序集合。数组描述的是相同类型的若干个数据,按照一定先后次序排列组合而成的一种结构。其中,每一个数据都可以被称作是一个元素,每个元素都可以通过一个索引(下标)来访问它们。

数组的四个基本特点如下:

  1. 数组的长度是固定的: 数组一旦被创建,其大小就不能发生改变。

  2. 数组中的元素类型必须一致: 数组中的元素必须是同一类型的,不允许出现混合类型。

  3. 数组类型可以是任何数据类型: 数组可以是任意数据类型,包括基本数据类型和引用类型。

  4. 数组有索引: 数组是有索引的,通过索引我们可以定位某一个元素的内容。索引是从 0 开始,到 数组.length -1 结束。

  5. 数组变量属于引用类型,数组也是对象的一种: 数组中的每个元素相当于该对象的成员变量。数组本身就是一个对象,Java 对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身还是在堆中存储数据的。

0x03:数组类型 — 数组的简单使用

0x0301:数组的声明 & 创建

一个数组由 4 个基本元素构成:数组名称,数组元素、元素索引、数据类型。在 Java 中,声明数组的方式如下:

数据类型[] 数组名;
数组名 = new 数据类型[长度];
-------------------------> 例
int[] x;            // 声明一个 int[] 类型的变量
x = new int[100];   // 为数组 x 分配 100 个元素空间

为了方便获得数组的长度,Java 提供了一个 length 属性,在程序中可以通过“数组名.length”的方式获得数组的长度,即元素的个数。看下面这个例子:

public class TestVar {public static void main(String[] args) {int[] arr; // 声明一个数组arr = new int[10]; // 给数组开辟一个长度为 10 的空间
​// 打印数组的长度System.out.println(arr.length);}
}

0x0302:数组的初始化 & 元素赋值

1. 默认初始化

当数组被成功创建后,如果没有给数组元素赋值,则数组中的元素会被自动赋予一个默认值,根据元素类型的不同,默认初始值也是不一样的,见下表:

数据类型默认初始值
byte short int long0
float double0.0
char一个空字符,即'\u0000'
booleanfalse
引用数据类型null,表示变量不引用任何对象

2. 静态初始化

静态初始化,就是在定义数组的同时为每个元素赋值:

类型[] 数组名 = new 类型[]{元素, 元素, ...};   // 不可以写成 int[] a = new[4]{1, 2, 3, 4}; 编译器会认为数组限定的元素个数[4]与实际存储的元素{1, 2, 3, 4}个数有可能不一致,存在一定的安全隐患。
类型[] 数组名 = {元素, 元素, ...};

看下面这个案例:

public class TestVar {public static void main(String[] args) {int[] arr = new int[]{10, 20, 30, 40};// 打印数组的长度System.out.println(arr.length);
​int[] arr2 = {50, 60, 70, 80, 90};//打印数组的长度System.out.println(arr2.length);}
}

3. 动态初始化

动态初始化,就是将为数组元素分配空间和赋值的操作分开进行。看下面这个案例(赋值时需要指定下标,数组的下标是从 0 开始算的):

public class TestVar {public static void main(String[] args) {int[] arr;arr = new int[3];
​// 赋值arr[0] = 1;arr[1] = 2;arr[2] = 3;
​System.out.println(arr[2]); // 打印 arr[2] 元素的值}
}

在上面那个案例中,我们创建了一个包含 3 个元素的 int 型数组,其下标范围为 0 ~ 2,问题来了,假设我给下标为 3 的元素赋值,会发生什么呢?

public class TestVar {public static void main(String[] args) {int[] arr;arr = new int[3];
​// 赋值arr[0] = 1;arr[1] = 2;arr[2] = 3;arr[3] = 4;
​System.out.println(arr[2]); // 打印 arr[2] 元素的值}
}

💥 Bug:数组索引越界

数组是一个容器,存储到数组中的每个元素都有自己的自动编号,最小值为 0,最大值为数组长度减 1,如果要访问数组存储的元素,必须依赖于索引。在访问数组的元素时,索引不能呢个超出 0 - length-1 的范围,否则程序会报错。

在使用变量引用一个数组时,变量必须指向一个有效的数组对象。如果该变量的值为 null,则意味着没有指向任何数组,此时通过该变量访问数组的元素会出现空指针异常。

0x0303:数组的使用

创建数组,并且为数组的元素赋值后,我们就可以使用数组啦。我们可以取出数组中任意下标的元素,并且进行后续的处理:

public class TestVar {public static void main(String[] args) {int[] arr = {10, 20, 30, 40};
​System.out.println("arr 数组的总长度为: " + arr.length);System.out.println("arr 数组中下标为 0 的元素为: " + arr[0]);System.out.println("arr 数组中下标为 1 的元素为: " + arr[1]);System.out.println("arr 数组中最后一个元素的值为: " + arr[arr.length - 1]);}
}

相关文章:

  • 【数据结构和算法】5. 堆栈和队列
  • 算法基础_数据结构【KMP + Trie 树 + 并查集 】
  • postgreSQL 如何使用 dblink
  • 微信小程序拖拽排序有效果图
  • 机器人进阶---视觉算法(六)傅里叶变换在图像处理中怎么用
  • 【Pytorch 中的扩散模型】去噪扩散概率模型(DDPM)的实现
  • Facebook商城开通全攻略:如何解决所在地区不可使用问题?
  • IPoIB驱动接收路径深度解析:从数据包到协议栈
  • 在Pytorch中使用Tensorboard可视化训练过程
  • 晨控CK-FR12与欧姆龙NX系列PLC配置EtherNet/IP通讯连接操作手册
  • Spring Boot多环境配置详解
  • GTS-400 系列运动控制器板(七)----修改限位开关触发电平
  • Cline Roo Code
  • 野外价值观:在真实世界的语言模型互动中发现并分析价值观
  • 【AI微信小程序开发】大转盘小程序项目代码:自设转盘选项和概率(含完整前端+后端代码)
  • docker 常见命令
  • Docker 数据卷
  • 基于 Vue 的Tiptap 富文本编辑器使用指南
  • vivado XMP使用
  • linux复习
  • 匈牙利总理投票反对乌克兰加入欧盟
  • 龚正会见巴西里约热内卢州州长克劳迪奥·卡斯特罗
  • 国际货币基金组织报告:将今年全球经济增长预期由此前的3.3%下调至2.8%
  • 印尼塔劳群岛附近发生6.3级左右地震
  • 三江购物:因自身商业需要,第二大股东阿里泽泰拟减持不超3%公司股份
  • 美国土安全部长餐厅遇窃,重要证件被盗走