Java数组核心知识点|基础+内存+扩容+排序详解
一、一维数组基础
1. 核心概念
数组是用于批量存储相同类型数据的容器,可实现批量数据的统一管理与操作,是Java最基础的数据结构。
2. 完整使用步骤
1. 声明数组:定义数组存储类型与名称,推荐格式: 数据类型[] 数组名;
2. 分配内存:指定数组长度,为数组开辟连续内存空间: 数组名 = new 数据类型[长度];
3. 元素操作:通过下标完成存取,下标从 0 开始,合法范围: 0 ~ 数组长度-1
- 存元素: 数组名[下标] = 数值;
- 取元素: 数组名[下标]
4. 遍历数组:利用循环依次访问所有元素,获取数组长度: 数组名.length
异常提醒:下标超出合法范围,运行抛出 ArrayIndexOutOfBoundsException (数组下标越界异常)
3. 数组默认初始化值
数组创建后,系统会自动为元素赋默认值,规则如下:
- 基本整数类型: 0
- 浮点类型: 0.0
- 布尔类型: false
- 字符类型:空字符
- 引用/对象类型: null
4. 三种初始化方式
1. 先声明后分配: int[] arr; arr = new int[5];
2. 声明同时初始化: int[] arr = new int[]{1,2,3,4};
3. 简写静态初始化: int[] arr = {1,2,3};
注意:简写方式必须声明和赋值同时完成,不可拆分。
二、数组内存原理(难点)
1. Java中数组在堆内存分配连续的存储空间,引用变量存储在栈内存。
2. 数组变量存储的是堆内存中数组的首地址,并非数组本身。
3. 寻址逻辑: 首地址 + 下标 × 单个元素占用字节数 ,下标从0开始,可提升寻址效率。
4. 赋值区别:
- 基本类型赋值:传递具体数值,互不影响;
- 数组(引用类型)赋值:传递内存地址,多个变量指向同一数组,修改会互相影响。
三、数组扩容实现
Java数组长度固定不可直接修改,扩容本质是:新建更长数组 → 复制旧元素 → 引用指向新数组,常规新数组长度为原数组2倍。
1. 手动循环扩容
int[] oldArr = {1,7,4,3};
// 1. 创建长度为原数组2倍的新数组
int[] newArr = new int[oldArr.length * 2];
// 2. 循环复制元素
for(int i = 0; i < oldArr.length; i++){
newArr[i] = oldArr[i];
}
// 3. 原数组引用指向新数组
oldArr = newArr;
2. 系统方法复制扩容
1. System.arraycopy(原数组, 原起始下标, 新数组, 新起始下标, 复制长度) :底层原生方法,效率高
2. Arrays.copyOf(原数组, 新长度) :自动创建新数组+完成复制,一行代码实现扩容
int[] arr = {1,6,8,3};
int[] newArr = Arrays.copyOf(arr, arr.length*2);
arr = newArr;
四、可变长参数
1. 概念
JDK5.0新增特性,用于定义接收任意个数同类型参数的方法,底层本质是数组。
2. 语法与规则
// 格式:数据类型... 参数名
public static void test(int... nums){
// nums 自动转为int[]数组,可直接遍历使用
for(int i : nums){
System.out.println(i);
}
}
- 一个方法最多只能有1个可变参数;
- 可变参数必须放在形参列表最后一位;
- 可接收0个、1个或多个同类型实参,提升代码通用性。
五、数组排序
1. 冒泡排序(基础手写)
核心逻辑:相邻元素两两比较,逆序则交换,每轮将最大值“冒泡”到末尾。
// 从小到大排序
for(int i = 1; i < arr.length; i++){
for(int j = 0; j < arr.length - i; j++){
if(arr[j] > arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
2. 选择排序
核心逻辑:固定当前下标,遍历后续所有元素,找到最小值交换到当前位置。
for(int i = 0; i < arr.length-1; i++){
for(int j = i+1; j < arr.length; j++){
if(arr[i] > arr[j]){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
3. 工具类快速排序
java.util.Arrays.sort(数组名) ,底层为优化后的快速排序,开发中直接使用。
六、二维数组
1. 概念
二维数组本质是存储一维数组的一维数组,可看作多行多列的表格,分为规则二维数组和不规则二维数组。
2. 基础语法
1. 声明: 数据类型[][] 数组名;
2. 分配空间: int[][] arr = new int[行数][列数];
3. 元素访问: 数组名[行下标][列下标] ,行、列下标均从0开始
4. 长度获取:
- arr.length :获取行数
- arr[i].length :获取第i行的列数
3. 初始化方式
1. 动态初始化: int[][] arr = new int[3][4]; (3行4列)
2. 静态初始化: int[][] arr = {{1,2},{3,4,5},{6}};
4. 不规则二维数组
每行元素个数不相等,语法要求:可只指定行数,不可单独指定列数
// 先定义行数,再逐行分配列数
int[][] arr = new int[3][];
arr[0] = new int[2];
arr[1] = new int[4];
arr[2] = new int[3];
更多推荐

所有评论(0)