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

[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]);}
}

http://www.xdnf.cn/news/1300.html

相关文章:

  • 进阶算法 第一课:贪心
  • 《门》凡是过往,皆为序曲。我们的爱,和最初一样
  • Qt Creator 创建 Qt Quick Application一些问题
  • 题解:P11185 奖牌排序
  • 麒麟V10安装MySQL8.4
  • 如何应对政策变化导致的项目风险
  • windows server2019 内网离线安装mysql5.7方式;windows server2019安装软件提示丢失msvcp100.dll问题处理
  • Java集成Zxing和OpenCV实现二维码生成与识别工具类
  • zRenamer:一款刚新鲜出炉的免费文件更改工具
  • MySQL基本查询与数据操作全面解析
  • ​​批发商商城小程序制作哪家强?开启高效批发新模式!
  • 大白话说MCP(Model Context Protocol)
  • Verilog 4:数组
  • pod 创建私有库指南
  • JavaScript 数组常用方法解析
  • 塔能风机节能方案:为工厂能耗精准“减负”
  • 《念无双》:仙侠世界中的传统文化交响
  • AT24C02芯片简介:小巧强大的串行EEPROM存储器
  • 力扣刷题Day 26:回文链表(234)
  • 配置spark
  • Gartner发布2025年全球IT支出最新预测:人工智能持续推动信息安全需求增加
  • 尾递归优化与函数柯里化
  • TCP三次握手与四次挥手面试回答版本
  • 自然语言处理 | 语言模型(LM) 浅析
  • spark-sql
  • 2023蓝帽杯初赛内存取证-5
  • springBoot_项目目录结构
  • 刀客doc:快手磁力引擎副总裁冯超离职,王志强接管渠道业务
  • 仅追加KV数据库
  • C# 跨进程 临界区 互斥 进程锁