Java基础指南之Arrays数组声明创建和基础操作详解
数组是Java中存储固定大小、同类型元素的容器,元素在内存中连续排列,访问速度快。声明方式为type[]arrayName,创建可用直接初始化、new关键字或Arrays.copyOf方法。通过索引访问元素,索引从0开始。遍历可用for循环或增强for循环。多维数组是数组的数组,常用二维数组和更高维度。Arrays工具类提供sort等实用方法。
数组是Ja va里非常基础但也极其重要的一个概念。简单来说,它就是一个用来存储固定大小、同类型元素的“容器”。这些元素在内存中连续排列,访问起来速度极快——这也是它最核心的优势之一。

那么,数组究竟有什么与众不同的特性?
- 固定大小:数组一旦创建,长度就不可改变。有点像预订好的座位,坐满了就不能再加人。
- 连续内存:元素在内存里紧挨着存放,访问时通过首地址加偏移量一步到位,性能极高。但劣势也很明显——创建大数组时,需要一次性申请一整块连续内存,如果内存碎片较多,可能申请失败。
- 同类型元素:数组中所有元素必须是相同数据类型,要么都是基本类型,要么都是对象类型。这样做保证了内存布局的规整和访问的确定性。
数组的声明和创建
声明数组
声明数组的语法很直观:
type[] arrayName;
type:元素的数据类型,可以是基本类型(如int、double)或引用类型(如String、自定义类)。arrayName:数组名称,遵循标识符命名规则。
创建数组
创建数组有好几种方式,看场景选最顺手的那种就行。
声明时直接初始化:
int[] numbers = {1, 2, 3, 4, 5};
使用new关键字分配内存:
int[] numbers = new int[5]; // 创建一个长度为5的整数数组,所有元素默认初始化为0
使用数组工厂方法(Ja va 8及以上):
int[] numbers = Arrays.copyOf(new int[]{1, 2, 3, 4, 5}, 5);
需要注意,用new int[5]创建时,元素会被赋予默认值——基本类型(如int是0,boolean是false),引用类型是null。
获取数组长度
数组没有length()方法,而是直接提供一个.length属性:
int[] numbers = {100, 200, 300, 400, 500};
int arraySize = numbers.length;
System.out.println("numbers的长度是: " + arraySize); // 输出: numbers的长度是: 5
这一点和字符串的length()方法不同,初学者容易搞混,稍微留意一下就好。
访问数组元素
通过索引访问元素,索引从0开始,到length-1结束。访问越界会抛出ArrayIndexOutOfBoundsException:
int[] numbers = {100, 200, 300, 400, 500};
int firstElement = numbers[0];
System.out.println("numbers的第一个元素: " + firstElement); // 100
int lastElement = numbers[numbers.length - 1];
System.out.println("numbers的最后一个元素: " + lastElement); // 500
遍历数组
遍历数组通常有两种方式,各自有适合的场合。
for循环:适合需要访问索引或修改元素的场景。
int[] numbers = {100, 200, 300, 400, 500};
for (int i = 0; i < numbers.length; i++) {
System.out.println("索引 "+i+"的元素: "+numbers[i]);
}
增强for循环(也叫for-each):写法简洁,不需要索引变量,适合只读遍历。
for (int number : numbers) {
System.out.println(number);
}
多维数组
多维数组本质上就是“数组的数组”。比如二维数组可以理解为一个表格,每一行是一个一维数组,所有行组成了二维数组。它在矩阵运算、棋盘游戏、图像处理等场景中非常常见。
二维数组
定义和初始化二维数组:
// 定义并初始化一个3行4列的整型二维数组
int[][] numbers = new int[3][4];
// 直接初始化二维数组
int[][] initializedNumbers = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
// 或者先分配行数,再逐行分配(每一行的列数可以不同)
int[][] mixedInitialization = new int[3][];
mixedInitialization[0] = new int[]{1, 2, 3, 4};
mixedInitialization[1] = new int[]{5, 6, 7, 8};
mixedInitialization[2] = new int[]{9, 10, 11, 12};
访问二维数组元素:
int[][] numbers = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
int value = numbers[1][2]; // 获取第二行第三列的值
numbers[0][0] = 100; // 改变第一行第一列的值
遍历二维数组:需要嵌套循环。外层行、内层列,一一处理。
for (int i = 0; i < numbers.length; i++) {
for (int j = 0; j < numbers[i].length; j++) {
System.out.print(numbers[i][j] + " ");
}
System.out.println();
}
更高维度数组
原理完全一样,只是维度更多。比如三维数组可以想象成一组二维数组堆叠起来:
int[][][] threeDimensionalArray = new int[3][3][3]; threeDimensionalArray[0][1][2] = 100; int value3D = threeDimensionalArray[0][1][2];
数组相关方法(Arrays工具类)
ja va.util.Arrays是Ja va标准库中专门为数组服务的工具类,封装了大量实用操作。以下是最常用的几个方法:
数组排序
sort():对一维数组进行升序排序。
int[] unsortedArray = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3};
Arrays.sort(unsortedArray);
如果需要对对象数组按自定义规则排序,可以使用重载版本:sort(T[] array, Comparator super T> c)。
填充方法
fill():把指定值填充到数组的所有元素或部分元素。
int[] arr = new int[5]; Arrays.fill(arr, 9); // 全部设为9
比较方法
equals():比较两个一维数组是否相等(元素相同且顺序一致)。
int[] numbers1 = {100, 200, 300, 400, 500};
int[] numbers2 = {100, 200, 300, 400, 500};
boolean arraysEqual = Arrays.equals(numbers1, numbers2); // true
deepEquals():用于对象数组或嵌套数组的深度比较,不仅仅是引用比较。
搜索方法
binarySearch():在已排序的数组中使用二分查找,返回目标元素的索引。如果没找到,返回负数。
int[] unsortedArray = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3};
int index = Arrays.binarySearch(unsortedArray, 5); // 注意:使用前最好先排序
转换方法
asList():将数组转换为List视图,但这个List是固定大小的,不能增删元素。
String[] stringArray = {"首页", "新闻", "关于我们", "联系我们"};
List list = Arrays.asList(stringArray);
复制方法
copyOf() 和 copyOfRange():复制数组的一部分或全部。
int[] numbers = {100, 200, 300, 400, 500};
int[] copiedArray = Arrays.copyOf(numbers, numbers.length);
System.out.println(Arrays.toString(copiedArray)); // [100, 200, 300, 400, 500]
String[] objectArray = {"A", "B", "C", "D", "E", "F", "G"};
String[] clonedStringArray = Arrays.copyOfRange(objectArray, 0, 4);
System.out.println(Arrays.toString(clonedStringArray)); // [A, B, C, D]
需要留意的是,copyOf()对于基本类型数组是深拷贝,但对于对象数组只复制引用,并不复制对象本身。如果需要真正的深拷贝,需要自己实现或借助序列化等手段。
打印数组
toString():把数组转换成易读的字符串格式,非常适合调试。
int[] numbers = {100, 200, 300, 400, 500};
System.out.println(Arrays.toString(numbers)); // [100, 200, 300, 400, 500]
总结一下:数组在Ja va中的地位就像基石,虽然简单但应用极广。尤其是在性能敏感的场景下,数组的连续内存访问特性是ArrayList等容器无法完全替代的。掌握好它的声明、创建、遍历以及工具类的使用,后续学习集合框架会轻松很多。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















