元数据卡
- 前置知识:第2章(变量与类型)、第4章(控制流——循环)
- 预计时间:15 分钟
- 阅读模式:👣稳步推进
- 完成标志:能创建和初始化一维数组;理解数组的固定长度和引用特性
遇到问题
你在变量村待了些日子了。每个变量都是一间独栋小房子——int age 住一个整数,double price 住一个小数,String name 住一串文字。每间房子只住一个人。你每次操作都是搬一个人出来、把新一个人放进去。
一切顺利,直到有一天村长把你叫到一片空地上。
"变量村太小了,房子都是独栋的。"村长指着远处的一片荒地说。"那里——我要建一条街。一条街上住一百个、一千个同类型的人。"
他掏出一卷图纸,上面画着一排整齐的小房子。
"数据从来不是孤零零出现的。"村长接着说。"你有一千个学生的成绩,难道要建一千个 int score1、int score2……一直到 int score1000?"
他拍了拍你的肩膀:"你需要一个能装很多东西的容器——但它必须统一规格,不能今天住整数、明天住字符串。"
"这个容器,叫 数组。"
第一幕:一条街的诞生——声明与创建
你站在空地上,村长递给你一张图纸。
图纸上写着一行字:
// 声明一条名为 scores 的整数街——先告诉 Java:我要一个整数数组
int[] scores;
// 创建——实际上在内存里分配 5 个连续的格子
scores = new int[5];语言:Java 如何运行:把两行代码写进 main 方法即可 发生了什么:第一行告诉编译器 scores 的类型是 int[](整数数组);第二行才实际在内存中分配空间 常见写法:也可以一句搞定:int[] scores = new int[5];
这条街刚建好时是这样的:
索引: [0] [1] [2] [3] [4]
值: 0 0 0 0 0注意:Java 的整数数组创建后,每个元素自动初始化为 0(String 数组是 null,boolean 数组是 false)。
为什么索引从 0 开始,不是 1?
因为算地址更方便:
地址 = 基地址 + 索引 × 每个元素大小。索引从 0,乘法都不用做。习惯就好——所有主流语言都从 0 开始。
给每间房子分配住户
光建好还不够,得有人住:
int[] scores = new int[5];
// 给每家每户赋值
scores[0] = 85;
scores[1] = 92;
scores[2] = 78;
scores[3] = 95;
scores[4] = 88;
// 读取第三个人的分数(索引 2)
System.out.println(scores[2]); // 78语言:Java 预期输出:78如何运行:写入 main 方法,编译运行 试试:把 scores[5] = 100; 加上——会怎么样?(答案:数组越界异常 ArrayIndexOutOfBoundsException)
你也可以在创建时直接填入初始值——这叫 静态初始化:
// 静态初始化——声明、创建、填值一步到位
int[] scores = {85, 92, 78, 95, 88};
// 上面等价于 new int[]{85, 92, 78, 95, 88}
// 但简写形式只能在声明时使用语言:Java 语法:{值1, 值2, ...} 在赋值给 int[] 变量时自动推断类型 注意:scores = {1, 2, 3}; 是不行的——这种简写只能在声明时用。如果声明后想赋值,必须用 scores = new int[]{1, 2, 3};
差异窗口:C++ 和 Python 怎么说
老陈把手册摊开:"C++ 和 Python 处理数组的方式各不相同,但核心概念一样。"
C++:
// C++ 静态数组(栈上分配)
int scores[5] = {85, 92, 78, 95, 88};
// 堆上分配(需要手动 delete)
int* scores = new int[5]{85, 92, 78, 95, 88};
delete[] scores; // 千万别忘了!C++ 有两种数组:固定大小的栈数组(自动释放)和堆数组(手动释放)。Java 的 new 永远在堆上分配,由垃圾回收器自动回收。
Python:
# Python 没有原生数组,但有 list——动态长度
scores = [85, 92, 78, 95, 88]
print(scores[2]) # 78Python 的 list 更像 Java 的 ArrayList——动态长度。Python 的 list 可以装不同类型(mixed = [1, "hello", True]),但工程上很少这么用。
🧠 大脑缓存
- 数组 = 同一类型元素的连续存储空间
- 声明
int[] scores;→ 创建new int[5];→ 赋值scores[0] = 85; - 静态初始化
int[] scores = {85, 92, 78}; - 索引从 0 开始,合法范围是
0到length - 1 - 一旦创建,长度不可变
下一步
你已经建好了一条街,但街上 5 户人你还没挨个拜访完。下一节,我们提着一壶酒,从街头走到街尾——索引访问、数组长度、遍历数组。