Java核心概念:数组与方法详解
四、数组深入理解
数组基础概念
数组是编程语言中最基础的数据结构之一,用于存储多个相同类型元素的连续内存空间。在Java语言中,数组本质上是一个对象,继承自java.lang.Object类,并实现了Cloneable和Serializable两个标记接口。
数组的基本操作包括声明、初始化和元素访问:
// 声明整型数组
int[] numbers;
// 分配内存空间,创建包含5个元素的数组
numbers = new int[5];
// 为特定位置赋值
numbers[0] = 10;
// 获取数组长度
int size = numbers.length;
二维数组的实现
Java支持创建嵌套数组,即数组中的每个元素本身也是数组。这种结构常用于表示表格、矩阵或棋盘等二维数据。
// 创建3行5列的二维整型数组
int[][] matrix = new int[3][5];
// 直接初始化二维数组
int[][] data = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// 访问特定位置元素
matrix[1][2] = 100;
数组相关算法
数组是大多数算法实现的基础载体,下面介绍几种经典的排序算法:
选择排序(Selection Sort):在待排序序列中寻找最小元素,放到起始位置,然后从剩余元素中继续寻找最小元素。
插入排序(Insertion Sort):将数据分为已排序和未排序两部分,依次将未排序元素插入到已排序序列的正确位置。
快速排序(Quick Sort):选择一个基准元素,将数组划分为小于基准和大于基准的两部分,递归排序子数组。
归并排序(Merge Sort):采用分治策略,将数组递归拆分至单个元素,再逐步合并成有序序列。
堆排序(Heap Sort):利用完全二叉堆的结构特性,将数组构建成最大堆,依次交换堆顶与末尾元素并调整堆。
冒泡排序改进版:添加交换标志位,当某轮遍历未发生任何元素交换时,说明数组已完全有序,可提前终止循环。
以下是完全可用的冒泡排序实现:
public static void bubbleSort(int[] arr) {
int n = arr.length;
boolean swapped;
for (int i = 0; i < n - 1; i++) {
swapped = false;
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swapped = true;
}
}
if (!swapped) {
break;
}
}
}
高维数组
除了二维数组,Java还支持三维及以上维度数组,实际应用中较少使用超过三维的数组。
// 声明三维数组
int[][][]立方体 = new int[2][3][4];
// 初始化并赋值
立方体[0][1][2] = 50;
五、方法的定义与使用
方法的核心作用
方法是组织代码的基本单元,它将完成特定功能的逻辑封装为一个独立单元。方法的主要价值体现在代码复用、模块化和信息隐藏三个方面。
- 代码复用:相同逻辑只需编写一次,可在多处调用
- 模块化:将复杂问题分解为多个独立模块
- 信息隐藏:调用者无需了解内部实现细节
方法的基本结构
方法的完整定义包含返回类型、方法名称、参数列表和方法体四个部分:
public 返回类型 方法名称(参数类型 参数名, 参数类型 参数名) {
// 方法体:具体实现逻辑
return 返回值;
}
返回类型:指定方法执行完毕后返回的数据类型,无返回值时使用void关键字。
方法命名规范:遵循驼峰命名规则,首字母小写,后续单词首字母大写。
参数列表:圆括号内列出所有输入参数,多个参数间用逗号分隔。
实际参数与形式参数
- 实际参数(实参):调用方法时传递的具体数值或变量
- 形式参数(形参):方法定义中声明的用于接收数据的变量
Java中采用值传递机制:基本类型传递数值副本,引用类型传递地址副本。方法内部对形参的修改不会影响原始实参。
JVM内存区域划分
Java虚拟机运行时内存分为五个主要区域:
- 方法区:存储类元数据、运行时常量池、静态变量
- 堆内存:存放所有new创建的对象和数组
- 虚拟机栈:保存方法调用时的局部变量、操作数栈、动态链接
- 程序计数器:记录当前线程执行的字节码行号
- 本地方法栈:为native方法提供运行环境
方法执行时,其局部变量和参数保存在栈帧中,new创建的对象实例保存在堆内存中。
方法重载机制
方法重载允许在同一个类中定义多个同名方法,通过不同的参数列表来区分。参数列表的差异体现在三个方面:参数个数不同、参数类型不同、参数顺序不同。
返回值类型不参与重载判断,因为单纯从调用角度无法确定调用的是哪个重载方法。
public class MathUtils {
public void showValue(int num) {
System.out.println("整数参数: " + num);
}
public void showValue(int num1, int num2) {
System.out.println("两个整数: " + num1 + ", " + num2);
}
public void showValue(double num) {
System.out.println("浮点数参数: " + num);
}
public void showValue(String text) {
System.out.println("字符串内容: " + text);
}
}
上述示例展示了如何通过不同的参数类型和个数来实现方法重载,编译器会根据调用时传递的参数自动匹配对应的方法版本。