今日目标
理解数组的概念和特点掌握数组的定义、初始化和访问方式学会数组的常见操作(遍历、查找、排序等)了解数组的常见异常(数组下标越界、空指针)
一、数组的基本概念
数组是相同数据类型的元素按顺序组成的集合,可以理解为 “一排连续的盒子”,每个盒子存储一个数据,且所有盒子的类型必须一致。
数组的特点:
长度固定:一旦创建,长度(元素个数)不能改变。元素类型相同:只能存储同一种数据类型(如 int 数组只能存整数,String 数组只能存字符串)。有序性:每个元素有唯一的 “下标”(索引),从开始(第一个元素下标为 0,第二个为 1,以此类推)。
0
二、数组的定义与初始化
数组的使用分为两步:声明和初始化(分配内存并赋值)。
1. 数组的声明
格式:
// 方式1:数据类型[] 数组名;
int[] scores; // 声明一个int类型的数组,用于存储成绩
// 方式2:数据类型 数组名[];(不推荐,可读性差)
String names[]; // 声明一个String类型的数组,用于存储姓名
建议用方式 1(
),更能体现 “数组是一种类型” 的概念。
int[] scores
2. 数组的初始化
初始化分为静态初始化(已知元素值)和动态初始化(已知长度,值后续赋值)。
(1)静态初始化
直接指定每个元素的值,数组长度由元素个数自动确定。
// 完整格式
int[] scores = new int[]{90, 85, 95, 78}; // 存储4个成绩,长度为4
// 简化格式(推荐,仅声明时可用)
String[] names = {"张三", "李四", "王五"}; // 存储3个姓名,长度为3
(2)动态初始化
先指定数组长度,元素值为默认值(整数 0、小数 0.0、布尔 false、引用类型 null),后续再逐个赋值。
// 格式:数据类型[] 数组名 = new 数据类型[长度];
double[] heights = new double[5]; // 声明一个长度为5的double数组(存储身高)
// 动态初始化后赋值(通过下标)
heights[0] = 1.75; // 第一个元素
heights[1] = 1.82; // 第二个元素
heights[2] = 1.68;
// 未赋值的元素(heights[3]、heights[4])默认是0.0
3. 数组的长度
数组一旦创建,长度固定,可通过获取(注意:length 是属性,不是方法,没有括号)。
数组名.length
int[] nums = {1, 2, 3};
System.out.println("数组长度:" + nums.length); // 输出:3
三、数组的访问与遍历
数组元素通过 “数组名 [下标]” 访问(赋值或取值),遍历则是逐个访问所有元素。
1. 访问单个元素
String[] fruits = {"苹果", "香蕉", "橙子"};
System.out.println(fruits[0]); // 取第一个元素:苹果
fruits[1] = "葡萄"; // 修改第二个元素
System.out.println(fruits[1]); // 输出:葡萄
2. 遍历数组(访问所有元素)
最常用的是循环,通过下标从 0 到
for遍历。
length-1
示例 1:遍历 int 数组,计算总和
int[] scores = {88, 92, 76, 90};
int sum = 0;
// 下标范围:0 ~ scores.length - 1
for (int i = 0; i < scores.length; i++) {
sum += scores[i]; // 累加每个元素
}
double avg = sum * 1.0 / scores.length; // 计算平均分(*1.0转为浮点型)
System.out.println("总分:" + sum + ",平均分:" + avg); // 总分:346,平均分:86.5
示例 2:增强 for 循环(foreach,JDK 5+)简化遍历代码,无需关注下标,直接获取每个元素(适合仅读取元素,不修改)。
String[] books = {"Java编程", "数据结构", "操作系统"};
// 格式:for (元素类型 变量名 : 数组名)
for (String book : books) {
System.out.println(book); // 依次输出每个元素
}
// 输出:
// Java编程
// 数据结构
// 操作系统
四、数组的常见操作
1. 查找元素(线性查找)
遍历数组,判断是否存在目标元素,返回其下标(不存在返回 – 1)。
public class ArraySearch {
public static void main(String[] args) {
int[] nums = {15, 28, 7, 36, 12};
int target = 36;
int index = -1; // 初始化为-1(表示未找到)
for (int i = 0; i < nums.length; i++) {
if (nums[i] == target) {
index = i;
break; // 找到后跳出循环
}
}
if (index != -1) {
System.out.println("元素" + target + "在数组中的下标是:" + index); // 3
} else {
System.out.println("数组中未找到元素" + target);
}
}
}

2. 数组排序(冒泡排序)
冒泡排序是一种简单的排序算法,核心思想是 “相邻元素两两比较,大的往后移”,重复多轮后数组有序。
示例:对 int 数组从小到大排序
public class BubbleSort {
public static void main(String[] args) {
int[] nums = {5, 2, 9, 1, 5, 6};
// 外层循环:控制排序轮数(n个元素需要n-1轮)
for (int i = 0; i < nums.length - 1; i++) {
// 内层循环:每轮比较的次数(每轮少比较一次,因为最后一个已排好)
for (int j = 0; j < nums.length - 1 - i; j++) {
// 如果前一个元素大于后一个,交换位置
if (nums[j] > nums[j + 1]) {
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
}
// 打印排序后的数组
System.out.print("排序后:");
for (int num : nums) {
System.out.print(num + " "); // 输出:1 2 5 5 6 9
}
}
}

实际开发中,可直接使用 Java 提供的方法(需导入
Arrays.sort()):
java.util.Arrays
import java.util.Arrays;
int[] nums = {5,2,9,1};
Arrays.sort(nums); // 自动排序(从小到大)
五、数组的常见异常
1. 数组下标越界异常(ArrayIndexOutOfBoundsException)
当访问的下标小于 0 或大于等于数组长度时抛出。
int[] nums = {1, 2, 3};
System.out.println(nums[3]); // 错误:下标3超出范围(最大下标是2)

2. 空指针异常(NullPointerException)
当数组未初始化(仅声明,未分配内存),却访问其元素或长度时抛出。
int[] nums; // 仅声明,未初始化(nums的值为null)
System.out.println(nums.length); // 错误:空指针异常

六、练习
基础练习:定义一个长度为 5 的 int 数组,动态初始化后,将 1-5 的平方值存入数组,然后遍历输出。
查找练习:定义一个 String 数组,统计 “Java” 出现的次数。
{"Java", "Python", "C", "Java", "PHP"}
排序扩展:对数组使用
{3, 1, 4, 1, 5, 9}排序后输出(记得导入
Arrays.sort())。
java.util.Arrays
今日总结
数组是存储相同类型元素的有序集合,长度固定,下标从 0 开始。初始化方式:静态初始化(已知元素)和动态初始化(已知长度)。访问元素:,遍历可用普通 for 循环或增强 for 循环。常见操作:查找(线性查找)、排序(冒泡排序或
数组名[下标])。注意异常:下标越界(检查下标范围)和空指针(确保数组已初始化)。
Arrays.sort()


