引言

        在 Java 编程中,数组是一种基础且重要的数据结构,它允许我们将多个相同类型的元素存储在一个连续的内存空间中,通过索引快速访问。掌握数组的使用是学习 Java 集合框架、算法等高级知识的基础。本章将从数组的创建、使用开始,逐步深入到 Arrays 工具类、二维数组的应用,最后通过实战案例巩固所学知识。

思维导图

5.1 创建和使用数组

5.1.1 数组定义

        数组是相同数据类型元素的有序集合,它具有固定长度,一旦创建不可改变。在 Java 中,数组属于引用类型,需要经历声明→创建→初始化三个步骤。

数组的声明方式
// 方式1:数据类型[] 数组名;(推荐,更清晰表示数组类型)
int[] numbers;
String[] names;// 方式2:数据类型 数组名[];(兼容C语言风格)
int scores[];
数组的创建(动态初始化)

        使用new关键字创建数组,指定长度,元素会被赋予默认值(数值型为 0,布尔型为 false,引用类型为 null):

// 声明并创建数组
int[] ages = new int[5]; // 创建长度为5的int数组
String[] fruits = new String[3]; // 创建长度为3的String数组
数组的初始化(静态初始化)

直接指定数组元素的值,长度由元素个数决定:

// 静态初始化完整格式
int[] nums = new int[]{1, 2, 3, 4, 5};// 简化格式(最常用)
String[] colors = {"red", "green", "blue"};
数组的访问

通过索引(从 0 开始)访问数组元素,使用数组名[索引]

public class ArrayDefinitionDemo {public static void main(String[] args) {// 静态初始化数组String[] languages = {"Java", "Python", "C++"};// 访问数组元素System.out.println("数组长度:" + languages.length); // 输出:3System.out.println("第一个元素:" + languages[0]); // 输出:Java// 修改数组元素languages[1] = "JavaScript";System.out.println("修改后第二个元素:" + languages[1]); // 输出:JavaScript// 遍历数组(普通for循环)for (int i = 0; i < languages.length; i++) {System.out.println("索引" + i + ":" + languages[i]);}}
}

注意:访问数组时如果索引超出范围(>=length<0),会抛出ArrayIndexOutOfBoundsException异常。

5.1.2 增强的 for 循环

增强 for 循环(foreach 循环)是 Java 5 引入的语法,专门用于遍历数组或集合,简化遍历代码。

语法格式
for (元素类型 变量名 : 数组名) {// 循环体,变量名表示当前元素
}
普通 for 循环 vs 增强 for 循环
public class ForEachDemo {public static void main(String[] args) {int[] scores = {85, 92, 78, 90, 88};// 普通for循环:可修改元素,需控制索引System.out.println("普通for循环遍历:");for (int i = 0; i < scores.length; i++) {scores[i] += 2; // 加分操作System.out.print(scores[i] + " ");}// 增强for循环:不可修改元素(变量是副本),无需控制索引System.out.println("\n增强for循环遍历:");for (int score : scores) {System.out.print(score + " ");}}
}
运行结果

注意:增强 for 循环中不能修改数组元素的值(变量是元素的副本),适合单纯的遍历场景;需要修改元素或使用索引时,仍需用普通 for 循环。

5.1.3 数组元素的复制

        数组复制是常见操作,Java 提供多种方式实现数组复制:手动复制、System.arraycopy()Arrays.copyOf()(后续 5.2.3 讲解)。

手动复制(循环赋值)
int[] source = {1, 2, 3, 4, 5};
int[] target = new int[source.length];
for (int i = 0; i < source.length; i++) {target[i] = source[i];
}
System.arraycopy () 方法

JDK 提供的 native 方法,效率高,语法:

System.arraycopy(源数组, 源起始索引, 目标数组, 目标起始索引, 复制长度);
示例代码
public class ArrayCopyDemo {public static void main(String[] args) {int[] source = {10, 20, 30, 40, 50};int[] target = new int[6]; // 目标数组长度6// 复制source的索引1开始的3个元素到target的索引2开始System.arraycopy(source, 1, target, 2, 3);// 遍历目标数组for (int num : target) {System.out.print(num + " "); // 输出:0 0 20 30 40 0 }}
}

注意:System.arraycopy()要求目标数组有足够空间,否则会抛出IndexOutOfBoundsException

5.1.4 数组参数与返回值

        数组作为引用类型,可以作为方法的参数或返回值,传递的是数组的引用(内存地址)。

数组作为参数(引用传递)
// 方法:打印数组元素
public static void printArray(int[] arr) {for (int num : arr) {System.out.print(num + " ");}System.out.println();
}// 方法:修改数组元素(会影响原数组)
public static void modifyArray(int[] arr) {for (int i = 0; i < arr.length; i++) {arr[i] *= 2;}
}
数组作为返回值
// 方法:创建并返回一个int数组
public static int[] createArray(int length) {int[] arr = new int[length];for (int i = 0; i < length; i++) {arr[i] = i + 1;}return arr;
}
完整示例
public class ArrayParamReturnDemo {public static void main(String[] args) {int[] nums = {1, 2, 3, 4};System.out.println("原数组:");printArray(nums); // 输出:1 2 3 4 modifyArray(nums);System.out.println("修改后数组:");printArray(nums); // 输出:2 4 6 8 int[] newArr = createArray(5);System.out.println("方法返回的数组:");printArray(newArr); // 输出:1 2 3 4 5 }// 打印数组public static void printArray(int[] arr) {if (arr == null) {System.out.println("数组为空");return;}for (int num : arr) {System.out.print(num + " ");}System.out.println();}// 修改数组元素public static void modifyArray(int[] arr) {if (arr == null) return;for (int i = 0; i < arr.length; i++) {arr[i] *= 2;}}// 创建数组public static int[] createArray(int length) {if (length <= 0) {return null; // 处理无效长度}int[] arr = new int[length];for (int i = 0; i < length; i++) {arr[i] = i + 1;}return arr;}
}

5.1.5 可变参数的方法

Java 5 引入可变参数(varargs),允许方法接收任意数量的相同类型参数,语法为类型... 参数名

语法格式
public static 返回类型 方法名(类型... 参数名) {// 方法体中参数名可作为数组使用
}
使用规则
  • 一个方法只能有一个可变参数
  • 可变参数必须是方法的最后一个参数
  • 调用时可传递 0 个、1 个或多个参数,也可直接传递数组
示例代码
public class VarargsDemo {public static void main(String[] args) {// 调用可变参数方法sum(); // 0个参数sum(1); // 1个参数sum(1, 2, 3); // 多个参数sum(new int[]{4, 5, 6}); // 传递数组}// 可变参数方法:计算多个整数的和public static void sum(int... nums) {int total = 0;for (int num : nums) {total += num;}System.out.println("总和:" + total);}// 混合参数(可变参数在最后)public static void printInfo(String name, int... scores) {System.out.println("姓名:" + name);System.out.println("成绩:");for (int score : scores) {System.out.print(score + " ");}System.out.println("\n---");}
}
运行结果

5.1.6 实例:随机抽取 4 张牌

需求分析

    模拟从 52 张扑克牌中随机抽取 4 张,不重复。扑克牌由 “花色” 和 “点数” 组成,需避免重复抽取。

实现思路
  1. 定义花色数组(红桃、黑桃、方块、梅花)和点数数组(A,2-10,J,Q,K)
  2. 使用两个数组记录已抽取的索引,避免重复
  3. 随机生成花色和点数的索引,检查是否已抽取,未抽取则记录并输出
完整代码
import java.util.Random;/*** 随机抽取4张扑克牌示例*/
public class CardDrawing {public static void main(String[] args) {// 定义花色和点数数组String[] suits = {"红桃", "黑桃", "方块", "梅花"};String[] ranks = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};// 记录已抽取的牌的索引(避免重复)boolean[] drawn = new boolean[52]; // 52张牌,初始值为falseint count = 0; // 已抽取的牌数Random random = new Random();System.out.println("随机抽取的4张牌:");// 循环抽取4张牌while (count < 4) {// 生成随机索引(0-51)int index = random.nextInt(52);// 如果未抽取过if (!drawn[index]) {drawn[index] = true; // 标记为已抽取count++; // 计数+1// 计算花色和点数索引int suitIndex = index / 13; // 0-3(每13张一种花色)int rankIndex = index % 13; // 0-12// 输出牌面System.out.println(suits[suitIndex] + ranks[rankIndex]);}}}
}
运行结果(示例)

5.1.7 实例:一个整数栈类

需求分析

   实现一个整数栈(Stack),支持入栈(push)、出栈(pop)、查看栈顶元素(peek)、判断栈空(isEmpty)、判断栈满(isFull)等操作。

实现思路
  1. 用数组作为栈的底层存储结构
  2. 定义栈顶指针(top),初始值为 - 1(栈空)
  3. 入栈:top+1,存入元素;出栈:返回 top 位置元素,top-1
类图(PlantUML)
class IntStack {- int[] elements  // 存储栈元素的数组- int top         // 栈顶指针(-1表示栈空)- int capacity    // 栈的容量+ IntStack(int capacity)  // 构造方法:初始化栈容量+ push(int value): boolean  // 入栈+ pop(): Integer  // 出栈(返回null表示栈空)+ peek(): Integer  // 查看栈顶元素+ isEmpty(): boolean  // 判断栈空+ isFull(): boolean   // 判断栈满+ size(): int  // 获取当前栈元素个数
}
流程图(入栈操作)

完整代码
/*** 整数栈类实现*/
public class IntStack {private int[] elements; // 存储栈元素的数组private int top; // 栈顶指针(-1表示栈空)private int capacity; // 栈的最大容量/*** 构造方法:初始化栈容量* @param capacity 栈的最大容量*/public IntStack(int capacity) {this.capacity = capacity;elements = new int[capacity];top = -1; // 初始栈空}/*** 入栈操作* @param value 要入栈的整数* @return 入栈成功返回true,栈满则返回false*/public boolean push(int value) {if (isFull()) {System.out.println("栈已满,无法入栈!");return false;}top++; // 栈顶指针上移elements[top] = value; // 存入元素return true;}/*** 出栈操作* @return 出栈的元素,栈空则返回null*/public Integer pop() {if (isEmpty()) {System.out.println("栈为空,无法出栈!");return null;}int value = elements[top]; // 获取栈顶元素top--; // 栈顶指针下移return value;}/*** 查看栈顶元素(不出栈)* @return 栈顶元素,栈空则返回null*/public Integer peek() {if (isEmpty()) {return null;}return elements[top];}/*** 判断栈是否为空* @return 空返回true,否则返回false*/public boolean isEmpty() {return top == -1;}/*** 判断栈是否已满* @return 满返回true,否则返回false*/public boolean isFull() {return top == capacity - 1;}/*** 获取当前栈中元素个数* @return 元素个数*/public int size() {return top + 1;}/*** 测试栈功能*/public static void main(String[] args) {IntStack stack = new IntStack(3); // 创建容量为3的栈// 测试入栈stack.push(10);stack.push(20);stack.push(30);stack.push(40); // 栈满,入栈失败// 测试栈状态System.out.println("栈是否满:" + stack.isFull()); // trueSystem.out.println("栈元素个数:" + stack.size()); // 3System.out.println("栈顶元素:" + stack.peek()); // 30// 测试出栈System.out.println("出栈元素:" + stack.pop()); // 30System.out.println("出栈元素:" + stack.pop()); // 20System.out.println("栈元素个数:" + stack.size()); // 1// 继续出栈System.out.println("出栈元素:" + stack.pop()); // 10System.out.println("出栈元素:" + stack.pop()); // 栈空,返回nullSystem.out.println("栈是否空:" + stack.isEmpty()); // true}
}
运行结果

5.2 Arrays 类

   java.util.Arrays类提供了大量静态方法,用于数组的操作(排序、查找、复制等),简化数组处理代码。使用前需导入该类。

5.2.1 数组的排序

    Arrays.sort()方法用于对数组进行排序,支持基本数据类型和对象数组(对象需实现Comparable接口)。

示例代码
import java.util.Arrays;/*** Arrays.sort()排序示例*/
public class ArraysSortDemo {public static void main(String[] args) {// 基本类型数组排序(升序)int[] intArr = {3, 1, 4, 1, 5, 9};Arrays.sort(intArr);System.out.println("排序后的int数组:" + Arrays.toString(intArr));// 字符串数组排序(按字典序)String[] strArr = {"banana", "apple", "orange", "grape"};Arrays.sort(strArr);System.out.println("排序后的字符串数组:" + Arrays.toString(strArr));// 部分排序(从索引1到4,不包含4)int[] partArr = {5, 3, 8, 2, 7, 1};Arrays.sort(partArr, 1, 4); // 排序索引1-3的元素System.out.println("部分排序后的数组:" + Arrays.toString(partArr));}
}
运行结果

5.2.2 元素的查找

    Arrays.binarySearch()方法用于在已排序的数组中查找元素,返回元素索引(未找到返回负数)。

语法格式
// 在整个数组中查找
static int binarySearch(数组, 目标值)// 在指定范围(fromIndex到toIndex)中查找
static int binarySearch(数组, fromIndex, toIndex, 目标值)
示例代码
import java.util.Arrays;/*** Arrays.binarySearch()查找示例*/
public class ArraysSearchDemo {public static void main(String[] args) {int[] arr = {2, 4, 6, 8, 10, 12};// 查找存在的元素int index1 = Arrays.binarySearch(arr, 8);System.out.println("元素8的索引:" + index1); // 输出:3// 查找不存在的元素int index2 = Arrays.binarySearch(arr, 5);System.out.println("元素5的索引(未找到):" + index2); // 输出:-3(插入点为2,-(2+1)=-3)// 范围查找int index3 = Arrays.binarySearch(arr, 1, 4, 6); // 在索引1-3中查找6System.out.println("范围查找元素6的索引:" + index3); // 输出:2}
}

注意:使用binarySearch()前必须确保数组已排序,否则结果不可靠!

5.2.3 数组元素的复制

  Arrays类提供copyOf()copyOfRange()方法复制数组,相比System.arraycopy()更简洁。

方法说明
  • copyOf(原数组, 新长度):复制原数组到新数组,新长度可大于或小于原长度(不足补默认值,超出截断)
  • copyOfRange(原数组, 起始索引, 结束索引):复制原数组从起始索引到结束索引(不包含)的元素
示例代码
import java.util.Arrays;/*** Arrays.copyOf()和copyOfRange()示例*/
public class ArraysCopyDemo {public static void main(String[] args) {int[] original = {1, 2, 3, 4, 5};// copyOf():新长度等于原长度int[] copy1 = Arrays.copyOf(original, 5);System.out.println("copy1:" + Arrays.toString(copy1)); // [1,2,3,4,5]// copyOf():新长度大于原长度(补默认值0)int[] copy2 = Arrays.copyOf(original, 7);System.out.println("copy2:" + Arrays.toString(copy2)); // [1,2,3,4,5,0,0]// copyOf():新长度小于原长度(截断)int[] copy3 = Arrays.copyOf(original, 3);System.out.println("copy3:" + Arrays.toString(copy3)); // [1,2,3]// copyOfRange():复制索引1到4(不包含4)的元素int[] rangeCopy = Arrays.copyOfRange(original, 1, 4);System.out.println("rangeCopy:" + Arrays.toString(rangeCopy)); // [2,3,4]}
}

5.2.4 填充数组元素

Arrays.fill()方法用于为数组的指定范围填充相同的值

示例代码
import java.util.Arrays;/*** Arrays.fill()填充数组示例*/
public class ArraysFillDemo {public static void main(String[] args) {// 初始化数组int[] arr1 = new int[5];// 填充整个数组为8Arrays.fill(arr1, 8);System.out.println("填充整个数组:" + Arrays.toString(arr1)); // [8,8,8,8,8]// 部分填充:索引1到4(不包含4)填充为5int[] arr2 = {1, 2, 3, 4, 5, 6};Arrays.fill(arr2, 1, 4, 5);System.out.println("部分填充后:" + Arrays.toString(arr2)); // [1,5,5,5,5,6]// 二维数组填充(填充每行的数组)String[][] strArr = new String[3][3];for (int i = 0; i < strArr.length; i++) {Arrays.fill(strArr[i], "A" + i); // 第i行填充"Ai"}System.out.println("二维数组填充后:");for (String[] row : strArr) {System.out.println(Arrays.toString(row));}}
}

5.2.5 数组的比较

   Arrays.equals()用于比较两个数组是否相等(长度相同且对应元素相等)Arrays.deepEquals()用于比较多维数组。

示例代码
import java.util.Arrays;/*** 数组比较示例*/
public class ArraysEqualsDemo {public static void main(String[] args) {// 一维数组比较int[] arr1 = {1, 2, 3};int[] arr2 = {1, 2, 3};int[] arr3 = {1, 2, 4};System.out.println("arr1与arr2是否相等:" + Arrays.equals(arr1, arr2)); // trueSystem.out.println("arr1与arr3是否相等:" + Arrays.equals(arr1, arr3)); // false// 长度不同的数组int[] arr4 = {1, 2};System.out.println("arr1与arr4是否相等:" + Arrays.equals(arr1, arr4)); // false// 二维数组比较(需用deepEquals)int[][] deepArr1 = {{1, 2}, {3, 4}};int[][] deepArr2 = {{1, 2}, {3, 4}};System.out.println("二维数组用equals比较:" + Arrays.equals(deepArr1, deepArr2)); // false(比较的是引用)System.out.println("二维数组用deepEquals比较:" + Arrays.deepEquals(deepArr1, deepArr2)); // true}
}

5.3 二维数组

    二维数组本质是 “数组的数组”,即每个元素都是一个一维数组。常用于表示表格、矩阵等二维结构。

5.3.1 二维数组定义

定义方式
// 方式1:声明并指定行数和列数
数据类型[][] 数组名 = new 数据类型[行数][列数];// 方式2:声明时不指定列数(不规则数组)
数据类型[][] 数组名 = new 数据类型[行数][];// 方式3:静态初始化
数据类型[][] 数组名 = {{元素1,元素2}, {元素3,元素4}, ...};
示例代码
/*** 二维数组定义示例*/
public class TwoDArrayDefine {public static void main(String[] args) {// 方式1:指定行数和列数(3行2列)int[][] arr1 = new int[3][2];System.out.println("arr1行数:" + arr1.length); // 3System.out.println("arr1第0行列数:" + arr1[0].length); // 2// 方式2:只指定行数,不指定列数(后续需初始化每行)int[][] arr2 = new int[2][];arr2[0] = new int[3]; // 第0行3列arr2[1] = new int[4]; // 第1行4列System.out.println("arr2第1行列数:" + arr2[1].length); // 4// 方式3:静态初始化String[][] arr3 = {{"张三", "男"}, {"李四", "女"}, {"王五", "男"}};System.out.println("arr3第2行第0列:" + arr3[2][0]); // 王五}
}

5.3.2 数组元素的使用

二维数组元素通过数组名[行索引][列索引]访问,行索引和列索引均从 0 开始。

示例代码
/*** 二维数组元素访问示例*/
public class TwoDArrayAccess {public static void main(String[] args) {// 创建3行3列的二维数组int[][] matrix = new int[3][3];// 给元素赋值(填充为1-9)int value = 1;for (int i = 0; i < matrix.length; i++) { // 遍历行for (int j = 0; j < matrix[i].length; j++) { // 遍历列matrix[i][j] = value++;}}// 访问并打印元素System.out.println("二维数组元素:");for (int i = 0; i < matrix.length; i++) {for (int j = 0; j < matrix[i].length; j++) {System.out.print(matrix[i][j] + " ");}System.out.println(); // 换行}// 增强for循环遍历System.out.println("增强for循环遍历:");for (int[] row : matrix) { // 每行是一个int数组for (int num : row) {System.out.print(num + " ");}System.out.println();}}
}
运行结果

5.3.3 数组初始化器

   二维数组的初始化包括静态初始化(直接指定元素)和动态初始化(先指定行数,再初始化每行)。

示例代码
import java.util.Arrays; // 添加Arrays导入/*** 二维数组初始化示例*/
public class TwoDArrayInit {public static void main(String[] args) {// 静态初始化:直接指定所有元素String[][] names = {{"Alice", "Bob"},{"Charlie", "David", "Eve"},{"Frank"}};// 打印静态初始化的数组System.out.println("静态初始化的二维数组:");for (String[] row : names) {System.out.println(Arrays.toString(row)); // 需要Arrays导入}// 动态初始化:先指定行数,再初始化每行int[][] dynamicArr = new int[2][];// 修复初始化语法错误dynamicArr[0] = new int[2]; // 先声明大小dynamicArr[0][0] = 10;     // 再赋值dynamicArr[0][1] = 20;dynamicArr[1] = new int[3]; // 先声明大小dynamicArr[1][0] = 30;      // 再赋值dynamicArr[1][1] = 40;dynamicArr[1][2] = 50;// 或者使用简化的正确语法:// dynamicArr[0] = new int[]{10, 20}; // 正确语法// dynamicArr[1] = new int[]{30, 40, 50}; // 正确语法System.out.println("\n动态初始化的二维数组:");for (int[] row : dynamicArr) {System.out.println(Arrays.toString(row)); // 需要Arrays导入}}
}
运行结果

5.3.4 实例:矩阵乘法

需求分析

    实现两个矩阵的乘法:若 A 是 m×n 矩阵,B 是 n×p 矩阵,则乘积 C 是 m×p 矩阵,其中C[i][j] = A[i][0]*B[0][j] + A[i][1]*B[1][j] + ... + A[i][n-1]*B[n-1][j]

流程图(矩阵乘法)

完整代码
import java.util.Arrays;/*** 矩阵乘法示例*/
public class MatrixMultiplication {/*** 矩阵乘法* @param A 第一个矩阵(m×n)* @param B 第二个矩阵(n×p)* @return 乘积矩阵C(m×p),若不可乘返回null*/public static int[][] multiply(int[][] A, int[][] B) {// 检查矩阵合法性if (A == null || B == null) return null;int m = A.length; // A的行数int n = A[0].length; // A的列数int p = B[0].length; // B的列数// 检查A的列数是否等于B的行数if (n != B.length) {System.out.println("矩阵不可乘!A的列数(" + n + ")≠ B的行数(" + B.length + ")");return null;}// 创建结果矩阵(m行p列)int[][] C = new int[m][p];// 计算矩阵乘积for (int i = 0; i < m; i++) { // 遍历A的行for (int j = 0; j < p; j++) { // 遍历B的列int sum = 0;for (int k = 0; k < n; k++) { // 累加计算C[i][j]sum += A[i][k] * B[k][j];}C[i][j] = sum;}}return C;}/*** 打印矩阵* @param matrix 要打印的矩阵*/public static void printMatrix(int[][] matrix) {if (matrix == null) {System.out.println("矩阵为空");return;}for (int[] row : matrix) {System.out.println(Arrays.toString(row));}}public static void main(String[] args) {// 定义两个可乘的矩阵(2×3 和 3×2)int[][] A = {{1, 2, 3},{4, 5, 6}};int[][] B = {{7, 8},{9, 10},{11, 12}};System.out.println("矩阵A:");printMatrix(A);System.out.println("\n矩阵B:");printMatrix(B);// 计算乘积int[][] C = multiply(A, B);System.out.println("\n矩阵乘积C = A×B:");printMatrix(C);}
}
运行结果

5.3.5 不规则二维数组

不规则二维数组指每行的列数不同的二维数组,创建时只需指定行数,每行单独初始化

示例代码
import java.util.Arrays;/*** 不规则二维数组示例*/
public class IrregularArray {public static void main(String[] args) {// 创建3行的不规则数组(不指定列数)int[][] irregular = new int[3][];// 初始化每行(列数不同)irregular[0] = new int[2]; // 第0行2列irregular[1] = new int[4]; // 第1行4列irregular[2] = new int[1]; // 第2行1列// 填充数据for (int i = 0; i < irregular.length; i++) {for (int j = 0; j < irregular[i].length; j++) {irregular[i][j] = i + j;}}// 打印不规则数组System.out.println("不规则二维数组:");for (int[] row : irregular) {System.out.println(Arrays.toString(row));}// 应用:杨辉三角(前5行)int[][] yanghui = new int[5][];for (int i = 0; i < yanghui.length; i++) {yanghui[i] = new int[i + 1]; // 第i行有i+1个元素yanghui[i][0] = 1; // 每行第一个元素为1yanghui[i][i] = 1; // 每行最后一个元素为1// 填充中间元素(i>1时)for (int j = 1; j < i; j++) {yanghui[i][j] = yanghui[i - 1][j - 1] + yanghui[i - 1][j];}}System.out.println("\n杨辉三角:");for (int[] row : yanghui) {System.out.println(Arrays.toString(row));}}
}
运行结果

5.4 小结

本章主要学习了 Java 数组的核心知识,包括:

  1. 一维数组

    • 定义与初始化(静态 / 动态)
    • 增强 for 循环遍历
    • 数组复制(System.arraycopy()Arrays.copyOf()
    • 数组作为参数和返回值,可变参数方法
  2. Arrays 工具类

    • 排序(sort())、查找(binarySearch()
    • 复制(copyOf()copyOfRange()
    • 填充(fill())、比较(equals()deepEquals()
  3. 二维数组

    • 定义与初始化(规则 / 不规则)
    • 元素访问与遍历
    • 矩阵乘法等实际应用

        数组是 Java 中处理批量数据的基础结构,掌握数组操作是学习集合、算法的前提。实际开发中需注意数组索引越界、空指针等异常,合理使用Arrays类简化代码。

编程练习

练习 1:数组元素求和与平均值

编写方法计算数组所有元素的和与平均值。

import java.util.Arrays; // 添加Arrays导入
/*** 数组求和与平均值练习*/
public class ArraySumAvg {public static void main(String[] args) {double[] numbers = {1.5, 2.5, 3.5, 4.5, 5.5};double[] result = calculateSumAndAvg(numbers);System.out.println("数组元素:" + Arrays.toString(numbers));System.out.println("总和:" + result[0]);System.out.println("平均值:" + result[1]);}/*** 计算数组的总和与平均值* @param arr 输入数组* @return 长度为2的数组,[0]是总和,[1]是平均值*/public static double[] calculateSumAndAvg(double[] arr) {if (arr == null || arr.length == 0) {return new double[]{0, 0}; // 空数组返回0}double sum = 0;for (double num : arr) {sum += num;}double avg = sum / arr.length;return new double[]{sum, avg};}
}

练习 2:查找数组最大值与索引

编写方法查找数组中的最大值及其所有索引。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;/*** 查找数组最大值与索引练习*/
public class FindMaxIndex {public static void main(String[] args) {int[] arr = {5, 3, 8, 8, 2, 8, 7};int max = findMax(arr);List<Integer> indices = findMaxIndices(arr, max);System.out.println("数组:" + Arrays.toString(arr));System.out.println("最大值:" + max);System.out.println("最大值索引:" + indices);}// 查找数组最大值public static int findMax(int[] arr) {if (arr == null || arr.length == 0) {throw new IllegalArgumentException("数组不能为空!");}int max = arr[0];for (int num : arr) {if (num > max) {max = num;}}return max;}// 查找最大值的所有索引public static List<Integer> findMaxIndices(int[] arr, int max) {List<Integer> indices = new ArrayList<>();for (int i = 0; i < arr.length; i++) {if (arr[i] == max) {indices.add(i);}}return indices;}
}

练习 3:二维数组转置

将 m×n 的矩阵转置为 n×m 的矩阵(行变列,列变行)。

import java.util.Arrays;/*** 二维数组转置练习*/
public class MatrixTranspose {public static void main(String[] args) {int[][] matrix = {{1, 2, 3},{4, 5, 6}};System.out.println("原矩阵(2×3):");printMatrix(matrix);int[][] transposed = transpose(matrix);System.out.println("\n转置后矩阵(3×2):");printMatrix(transposed);}/*** 矩阵转置* @param matrix 原矩阵(m×n)* @return 转置后的矩阵(n×m)*/public static int[][] transpose(int[][] matrix) {if (matrix == null || matrix.length == 0) return null;int m = matrix.length; // 原矩阵行数int n = matrix[0].length; // 原矩阵列数int[][] result = new int[n][m]; // 转置后n行m列for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {result[j][i] = matrix[i][j]; // 行变列,列变行}}return result;}// 打印矩阵public static void printMatrix(int[][] matrix) {for (int[] row : matrix) {System.out.println(Arrays.toString(row));}}
}

结语

        数组是 Java 编程中不可或缺的数据结构,本章通过理论讲解和实战案例,详细介绍了数组的创建、使用、工具类及二维数组的应用。希望通过本文的学习,你能熟练掌握数组操作,并能在实际开发中灵活运用。后续章节将学习更复杂的集合框架,数组知识是其重要基础,建议多动手练习巩固哦!

        如果有任何问题或建议,欢迎在评论区留言交流~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/90611.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/90611.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/90611.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Spring Boot的可盈保险合同管理系统的设计与实现(源码+论文)

一、相关技术 技术/工具描述SSM框架在JavaWeb开发中&#xff0c;SSM框架&#xff08;Spring Spring MVC MyBatis&#xff09;是流行的选择。它既没有SSH框架的臃肿&#xff0c;也没有SpringMVC的简化&#xff0c;属于中间级别&#xff0c;更灵活且易于编写和理解。MyBatis框…

​​XSLT:XML转换的“魔法棒”​

大家好&#xff01;今天我们来聊聊 ​​XSLT​​&#xff08;Extensible Stylesheet Language Transformations&#xff09;&#xff0c;一种用于转换和呈现XML文档的神奇工具。如果你曾需要将一堆枯燥的XML数据变成精美的HTML网页、PDF报告&#xff0c;或其他XML格式&#xff…

面试实战,问题十,如何保证系统在超过设计访问量时仍能正常运行,怎么回答

如何保证系统在超过设计访问量时仍能正常运行 在Java面试中&#xff0c;当被问及如何保证系统在访问量激增&#xff08;例如从100万用户增长到200万&#xff09;时仍能稳定运行&#xff0c;这是一个考察高并发、可扩展性和容错能力的关键问题。核心在于通过架构设计、性能优化和…

DMDSC安装部署教程

一、环境准备 虚拟机准备&#xff0c;添加共享磁盘 &#xff08;1&#xff09;共享存储规划 裸设备名 容量 用途 /dev/sdb 10 G /dev/asmdata0&#xff08;数据磁盘&#xff09; /dev/sdc 5 G /dev/asmdcr&#xff08;DCR 磁盘&#xff09; /dev/sdd 5 G /dev/asm…

半导体 CIM(计算机集成制造)系统

半导体CIM&#xff08;Computer Integrated Manufacturing&#xff0c;计算机集成制造&#xff09;系统是半导体制造的“神经中枢”&#xff0c;通过整合硬件设备、软件系统和数据流转&#xff0c;实现从订单到成品的全流程自动化、信息化和智能化管理。其工作流程高度贴合半导…

AI是否会终结IT职业?深度剖析IT行业的“涌现”与重构

引言&#xff1a;一场不可回避的技术审判在ChatGPT、Copilot、Claude、Sora 等AI技术密集爆发的今天&#xff0c;IT行业首当其冲地感受到这股浪潮带来的“智力替代压力”。尤其是以开发、测试、运维、分析为主的岗位&#xff0c;逐渐被AI所“渗透”。于是&#xff0c;问题摆在每…

mid360连接机载电脑,远程桌面连接不上的情况

为什么会出现这种情况呢&#xff0c;一开始我以为是雷达使用的网线&#xff0c;使用的是和网络同样的口&#xff0c;是因为机载电脑带宽不足&#xff0c;所以导致的&#xff0c;但是后面发现不管是哪一个机载电脑都会断开连接&#xff0c;后面了解得知&#xff0c;并不是连接的…

目标检测系列(六)labelstudio实现自动化标注

一、启用图片文件服务用Nginx启用图片服务&#xff0c;配置好映射路径。新建图片文件夹&#xff0c;将文件夹下的图片路径存储到txt文件中访问地址&#xff08;文件夹&#xff09;&#xff1a;http://112.12.19.122:8081/urls/ml-backend-test/进入labelstudio将txt文件路径填入…

从零开始大模型之编码注意力机制

从零开始大模型之编码注意力机制1 长序列建模中的问题2 使用注意力机制捕捉数据依赖关系3 自注意力机制4 实现带可训练权重的自注意力机制5 利用因果注意力隐藏未来词汇6 将单头注意力扩展到多头注意力7 Pytorch附录7.1 torch.nn.Linear多头掩码可训练权重的注意力机制。为什么…

小架构step系列26:Spring提供的validator

1 概述对于Web服务&#xff0c;需要对请求的参数进行校验&#xff0c;可以对不合法的参数进行提示&#xff0c;提高用户体验。也可以防止有人恶意用一些非法的参数对网站造成破坏。如果是对每个参数都写一段代码来判断值是否合法&#xff0c;那校验的代码就很多&#xff0c;也很…

0编程基础:用TRAE写出了会蹦跳躲避散发炫光的贪吃蛇小游戏

在某个深夜的代码深渊里&#xff0c;一个从未写过print("Hello World")的小白开发者&#xff0c;竟用自然语言指令让贪吃蛇跳起了"光棱华尔兹"——蛇身折射出彩虹轨迹&#xff0c;食物像星舰般自动规避追击&#xff0c;甚至实现了四头蛇的"量子纠缠式…

在Word和WPS文字中要同时查看和编辑一个文档的两个地方?拆分窗口

如果要在Word或WPS文字的长文档中同时查看两部同步的地方&#xff08;文档位置&#xff09;&#xff0c;来回跳转和滚动费时费力&#xff0c;使用拆分窗口的功能即可搞定。将窗口一分为二&#xff0c;上下对照非常方便。一、拆分窗口的路径Word和WPS基本一样&#xff0c;就是菜…

Windows系统下安装mujoco环境的教程【原创】

在学习Mujoco仿真的过程中&#xff0c;我先前是在linux系统下进行的研究与学习&#xff0c;今天来试试看在windows系统中安装mujoco仿真环境。 先前在linux中的一些关于mujoco学习记录的博客&#xff1a;Mujoco仿真【xml文件的学习 3】_mujoco打开xml文件-CSDN博客 下面开始wi…

CSS中篇

#Flex布局#1、什么是flex布局&#xff1f;flex 布局&#xff0c;全称弹性布局&#xff08;Flexible Box Layout&#xff09;&#xff0c;是 CSS3 中引入的一种新的布局模式。它主要通过给容器设置相关属性&#xff0c;来控制容器内部子元素的排列方式。相比传统的浮动布局和定位…

《云计算蓝皮书 2025 》发布:云计算加速成为智能时代核心引擎

近日&#xff0c;中国信息通信研究院发布了《云计算蓝皮书&#xff08;2025 年&#xff09;》&#xff0c;全面剖析了云计算领域的发展现状与未来趋势。在人工智能蓬勃发展的当下&#xff0c;云计算正从基础资源供给向智能时代的核心引擎加速转变&#xff0c;成为重塑全球数字竞…

excel删除重复项场景

问题描述 问题描述&#xff1a;因为表格中存在多条相同的数据&#xff0c;我现在excel有一列&#xff0c;值为#N/A 。另外有列叫做药品名称、规格、厂家 我要删除值为 #N/A&#xff0c;并且 药品名称、规格、厂家相等的数据&#xff0c;那条相同的删掉,只保留一条&#xff0c;…

Vue 3 与 Element Plus 中的 /deep/ 选择器问题

Vue 3 与 Element Plus 中的 /deep/ 选择器问题 在 Vue3 中使用 Element Plus 组件时&#xff0c;使用 ::v-deep或 :deep()的场景取决于 ​​样式作用域​​ 和 ​​选择器目标​​。以下是关键区别&#xff1a;

2025暑期—06神经网络-常见网络

六个滤波核提取特征Maps5X5 卷积核&#xff0c;1个阈值 6个元素&#xff0c;卷积后两边各少两个&#xff0c;28*28像素 又有6个卷积核&#xff0c;所以有122304个连接&#xff0c;连接数不多是因为很多都是公用参数的。池化是参数池化&#xff0c;和当前平均最大不一样。编程14…

硅基计划3.0 学习总结 叁 栈和队列

文章目录一、栈1. 模拟实现栈2. 小试牛刀1. 判断一个栈的出栈顺序是否为题目给定情况2. 括号匹配3. 逆波兰表达式求值4. 求最小栈元素3. 单链表实现栈二、队列1. 官方队列类Queue2. 双向链表模拟实现Queue类3. 顺序表模拟实现Queue类4. 双端队列5. 队列实现栈6. 栈实现队列一、…

飞行控制领军者 | 边界智控携高安全级飞控系统亮相2025深圳eVTOL展

2025深圳eVTOL展将于2025年9月23日至25日在深圳坪山燕子湖国际会展中心盛大举办。本届展会以 “低空经济・eVTOL・航空应急救援・商载大型无人运输机” 为核心&#xff0c;预计将汇聚200余位发言嘉宾、500 余家顶尖展商及15,000余名专业观众&#xff0c;规模盛大&#xff0c;精…