【Java】数组,从基础到常用操作,一篇就够了
大家好,我是云扬。
今天咱们来啃一啃 Java 基础里必学、必考、必用的核心知识点 —— 数组。数组不只是编程里最基础的数据结构,更是咱们后面学 ArrayList、各种集合框架的底层根基,把数组吃透,后面学源码会轻松很多。
一、数组到底是个啥?
先给数组下个清晰的定义:
- 数组是一个对象,用来存放固定数量、相同类型的元素
- 元素按索引存放,索引从 0 开始
- 元素类型可以是基本数据类型(int、double 等),也可以是引用类型(String、自定义对象等)
而且大家要记住:ArrayList 的底层就是用数组实现的,核心就是 Object[] elementData,所以学好数组 = 理解集合的第一步。
二、数组的声明与初始化
1. 两种声明方式(推荐第一种)
// 推荐写法:类型[] 数组名
int[] anArray;
// 不推荐写法(兼容 C/C++ 风格)
int anOtherArray[];
2. 两种初始化方式
(1)动态初始化:指定长度,自动赋默认值
用 new 关键字创建,说明数组真的是对象,不同类型默认值不同:
- 基本数字类型:
0 - 布尔类型:
false - 引用类型:
null
// 开辟长度为 10 的 int 数组,默认全 0
int[] arr1 = new int[10];
// 开辟长度为 3 的 String 数组,默认全 null
String[] arr2 = new String[3];
(2)静态初始化:直接指定元素
// 完整写法
int[] arr3 = new int[]{1, 2, 3, 4, 5};
// 简写(常用)
int[] arr4 = {1, 2, 3, 4, 5};
三、数组最常用操作:访问 & 遍历
1. 按索引访问元素
int[] arr = {10, 20, 30};
// 赋值
arr[0] = 100;
// 取值
System.out.println(arr[0]); // 输出:100
⚠️ 注意:索引范围是 0 ~ length-1,超出就会抛 数组越界异常 ArrayIndexOutOfBoundsException。
2. 两种遍历方式
① 普通 for 循环(需要操作索引时用)
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
② for-each 循环(只遍历元素,推荐)
for (int num : arr) {
System.out.println(num);
}
四、可变参数:本质就是数组
Java 里的可变参数 ...,底层就是用数组实现的,可以接收 0 个或多个参数。
/**
* 可变参数方法
* @param varargs 本质就是 String[]
*/
public void varargsMethod(String... varargs) {
for (String str : varargs) {
System.out.println(str);
}
}
// 调用方式1:直接传多个字符串
varargsMethod("云扬", "一枚有趣的程序员");
// 调用方式2:直接传数组
String[] strArr = {"云扬", "Java 爱好者"};
varargsMethod(strArr);
五、数组 ↔ List 互转(高频面试 + 开发)
开发中经常要在数组和 List 之间切换,这里有个大坑一定要注意。
1. 数组转 List
import java.util.*;
import java.util.stream.Collectors;
public class ArrayToListDemo {
public static void main(String[] args) {
Integer[] arr = {1, 2, 3, 4, 5};
// 1. Arrays.asList 转换
List<Integer> list = Arrays.asList(arr);
// ⚠️ 坑:这里返回的不是 java.util.ArrayList,不能增删!
// list.add(6); // 运行报错!
// 2. 转成真正的、可增删的 ArrayList(标准写法)
List<Integer> realList = new ArrayList<>(Arrays.asList(arr));
realList.add(6); // 正常执行
// 3. int[] 这类基本类型数组,要用流式装箱
int[] intArr = {1,2,3};
List<Integer> intList = Arrays.stream(intArr)
.boxed()
.collect(Collectors.toList());
}
}
2. List 转数组
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
// List 转数组
Integer[] arr = list.toArray(new Integer[0]);
六、数组排序 & 二分查找
1. 排序:Arrays.sort()
int[] sortArr = {5, 2, 9, 1, 3};
// 升序排序
Arrays.sort(sortArr);
// 结果:[1, 2, 3, 5, 9]
2. 二分查找(必须先排序)
数组有序后,用二分查找效率远高于挨个遍历:
// 查找元素 3,返回对应索引
int index = Arrays.binarySearch(sortArr, 3);
System.out.println(index); // 输出:2
七、数组复制:高效写法
数组复制推荐用官方底层方法,效率远高于自己写循环。
1. System.arraycopy(native 方法,性能最高)
int[] src = {1, 2, 3, 4, 5};
int[] dest = new int[5];
// 参数:源数组, 源起始索引, 目标数组, 目标起始索引, 复制长度
System.arraycopy(src, 0, dest, 0, src.length);
2. Arrays.copyOfRange(常用,底层还是 System.arraycopy)
// 从索引1复制到索引4(左闭右开)
int[] copyArr = Arrays.copyOfRange(src, 1, 4);
// 结果:[2, 3, 4]
八、最常见异常:数组越界
只要记住一句话:
数组索引从 0 开始,最大索引 = 数组长度 – 1
错误示例:
int[] arr = {1,2,3}; // 长度 3,索引 0、1、2
System.out.println(arr[3]); // 抛 ArrayIndexOutOfBoundsException
以上就是 Java 数组最核心、最常用的知识点,从定义、初始化、遍历,到和 List 互转、排序复制、异常避坑,基本覆盖了开发和面试里 90% 的数组考点。
我是云扬,后续会继续更新 Java 基础、MySQL、网站建设相关干货,咱们下篇见。



