一、数组基础
1. 含义:一块可以批量存放同种类型数据的容器,能一次性批量处理容器内所有数据。
2. 使用数组三步走:
① 声明数组:确定存储的数据类型,给数组取名
推荐写法: 数据类型[] 数组名; 例: int[] a;
也可简写: int a[];
② 开辟存储空间:规定数组最多能存多少个数据(也就是数组长度)
格式: 数组名 = new 数据类型[长度];
③ 操作数组(基础必学)
– 数组里每一条单独数据叫数组元素
– 数组操作分两类:存数据、取数据
– 存取依靠「数组名+下标编号」实现:
存值: 数组名[下标] = 数值;
取值: 数组名[下标]
– 数组每个格子都有专属编号,这个编号就是下标,下标从0开始,最大下标=数组总长度-1
– 踩坑提醒:如果使用超出 0 ~ 数组长度-1 范围的下标,代码编译不会报错,但运行会直接报错,报错提示:数组下标越界(ArrayIndexOutOfBoundsException)
数组扩容工具
1. 拷贝方法参数说明:
第4个参数:新数组从哪个位置开始存放复制过来的数据
第5个参数:需要复制多少个元素
2. 简化扩容方法 Arrays.copyOf()
一行代码完成「创建更长的新数组 + 复制原数组全部内容」
参数1:需要扩容的原始数组
参数2:自定义新数组的长度
示例代码:
java
int[] a = {1,6,8,3};
// 把数组扩容为原来2倍长
int[] b = Arrays.copyOf(a,a.length*2);
// 让原数组变量指向扩容后的新数组
a = b;
二、可变长参数(读源码、调用工具类时很常见)
1. 定义:方法可以接收数量不固定的实参,JDK5版本新增功能
2. 特点:传参个数由调用代码自由决定,只能接收同一种数据类型的数据
3. 基础语法: public static 返回值 方法名(数据类型…参数名){}
4. 使用逻辑:可变长参数底层会自动转换成对应类型的数组,方法内部直接把它当成数组使用即可
示例代码:
java
public static void fun(int…a){ // 自动生成int数组a
System.out.println("方法执行");
System.out.println("数组长度:"+a.length);
// 直接用循环遍历数组
for(int i=0;i<a.length;i++){
System.out.println(a[i]);
}
}
5. 硬性语法规则:一个方法里最多只能有1组可变长参数,且必须写在所有普通参数的末尾
6. 优势:让方法适配更多场景,代码更灵活通用
三、数组排序(面试高频考点)
1. 冒泡排序
思路:逐一比对相邻两个数字,把更大的数字逐步往后挪动,最终实现从小到大排列
java
// 外层循环:控制总比较轮次,最多循环【数组长度-1】轮
for(int i = 1;i<a.length;i++){
// 内层循环:每一轮内部相邻元素两两对比
for(int j=0;j<a.length-i;j++){
// 前一个数字比后一个大,就交换两者位置
if(a[j] > a[j+1]){
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
2. 选择排序
思路:固定一个位置的数字,拿它和后面所有数字挨个对比,把更小的数字逐步换到前面,实现升序排列
java
// 外层循环:控制每一轮固定对比的基准位置
for(int i=0;i<a.length-1;i++){
// 内层循环:拿基准位置数字和后面全部数字对比
for(int j=i+1;j<a.length;j++){
// 后面数字更小,交换两者
if(a[i]>a[j]){
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
3. 工具快速排序
直接调用工具类自带排序方法: java.util.Arrays.sort(数组名) ,底层是高效快速排序,日常开发优先使用
四、二维数组(了解即可)
1. 基础语法
① 声明: 数据类型[][] 数组名;
② 分配空间: 数组名 = new 数据类型[行数][列数];
行数=高维,列数=低维
2. 二维数组使用方式
① 访问元素: 数组名[行下标][列下标] ,行、列下标都从0开始
例: a[0][3] 代表第1行第4列的数据
② 默认值规则:二维数组和普通一维数组一样,创建后自带默认初始值
③ 获取长度:
获取总行数: 数组名.length
获取某一行的列数: 数组名[行下标].length
补充:二维数组本质是「存放一维数组的一维数组」
3. 二维数组多种定义写法
1. 声明同时开辟空间: 数据类型[][] 数组名 = new 数据类型[行数][列数];
2. 直接赋值初始化: 数据类型[][] 数组名 = new 数据类型[][]{{值1,值2},{值3,值4}};
注意:大括号里每组数字的数量代表每行有多少列,这里不能手动写出行、列数值
3. 简写初始化: 数据类型[][] 数组名 = {{值1,值2},{值3,值4}};
注意:变量声明和初始赋值必须写在同一行
4. 不规则二维数组
1. 特点:数组里每一行包含的元素数量(列数)互不相同
2. 不规则数组定义方式
① 先定义总行数,再单独给每一行单独开辟列空间
java
// 只规定总行数,不定义列数
数据类型[][] 数组名 = new 数据类型[行数][];
// 单独为每一行分配不同长度
数组名[0] = new 数据类型[长度];
数组名[1] = new 数据类型[长度];
注意:二维数组初始化时可以只指定行数(高维),不能只写列数(低维)
② 直接赋值不规则数组: 数据类型[][] 数组名 = {{1},{1,2,3},{1,2}};


