掘金 后端 ( ) • 2024-04-16 13:44

数组是Java中一种用来存储固定大小的同类型元素的数据结构。数组可以看作是数据元素的一个容器,这些元素在内存中是连续存储的,这使得访问数组中的元素非常快速。以下为数组的特性:

  • 固定大小:数组一旦创建,其长度就不能改变。
  • 连续内存:数组的元素在内存中是连续存储的,这有助于提高访问速度,但也意味着创建大型数组可能会消耗大量内存。
  • 同类型元素:数组中的所有元素必须是相同的数据类型。

数组的声明和创建

声明数组

数组声明的一般形式如下:

type[] arrayName;
  • type:是数组中元素的数据类型,可以是任何基本数据类型或对象类型;
  • arrayName:是数组的名称(参照标识符起名规则)。

创建数组

数组可以通过以下几种方式创建:

  • 声明时初始化:
int[] numbers = {1, 2, 3, 4, 5};
  • 使用new关键字:
int[] numbers = new int[5]; // 创建一个长度为5的整数数组,所有元素默认初始化为0
  • 使用数组工厂方法(Java 8及以上):
int[] numbers = Arrays.copyOf(new int[]{1, 2, 3, 4, 5}, 5);

获取数组长度

  • 可以通过.length属性获取数组的长度:
// 创建数组并声明
int[] numbers = {100, 200, 300, 400, 500};
// 获取数组的长度
int arraySize = numbers.length;
System.out.println("numbers的长度是: " + arraySize); // numbers的长度是: 5

访问数组元素

  • 数组元素可以通过索引访问。索引从0开始,到数组长度减1结束。:
// 创建数组并声明
int[] numbers = {100, 200, 300, 400, 500};
// 获取第一个元素
int firstElement = numbers[0];
System.out.println("numbers的第一个元素: " + firstElement); // numbers的第一个元素: 100
// 获取最后一个元素
int lastElement = numbers[numbers.length - 1];
System.out.println("numbers的最后一个元素: " + lastElement); // numbers的最后一个元素: 500

遍历数组

数组可以通过循环进行遍历,有以下两种遍历方式:

for循环:

// 创建数组并声明
int[] numbers = {100, 200, 300, 400, 500};
// for循环
for (int i = 0; i < numbers.length; i++) {
    System.out.println("索引 "+i+"的元素: "+numbers[i]);
}

增强for循环(也称为“for-each”循环):

// 创建数组并声明
int[] numbers = {100, 200, 300, 400, 500};
// 增强for循环
for (int number : numbers) {
    System.out.println(number);
}

多维数组

多维数组是数组的数组,即数组元素本身也是数组。

  • 多维数组在Java中主要用于处理数据结构具有多个维度的场景,如矩阵运算、棋盘游戏、图像处理等。
  • 在Java中,最常见的是二维数组,但理论上可以创建任意维度的数组。

二维数组

二维数组可以形象地理解为一个表格,其中每一行是一个一维数组,所有的行构成了一个二维数组。

定义和初始化二维数组:

// 定义并初始化一个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]; // 获取第二行第三列的值,数组索引从0开始
​
// 修改二维数组元素
numbers[0][0] = 100; // 改变第一行第一列的值

遍历二维数组:

  • 遍历多维数组通常需要使用多层嵌套循环,而对于更高维度的数组,访问和操作的复杂度也会相应增加。
// 直接初始化二维数组
int[][] numbers = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};
​
// 使用嵌套循环遍历二维数组
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(); // 换行显示每行结果
}

更高维度数组

更高维度的数组原理类似,例如三维数组可以想象为一组二维数组,每层都可以是一个二维数组。

// 定义一个3x3x3的三维整型数组
int[][][] threeDimensionalArray = new int[3][3][3];
​
// 初始化一个三维数组
threeDimensionalArray[0][1][2] = 100; // 给第一层第二行第三列赋值
​
// 访问三维数组元素
int value3D = threeDimensionalArray[0][1][2];

数组相关方法(Arrays工具类)

java.util.Arrays 是Java标准库中一个非常重要的工具类,提供了对数组进行排序、填充、比较、搜索以及转换等多种操作的功能。以下是java.util.Arrays类中的一些常用方法及其详细解释:

数组排序

  • sort():对给定的一维数组进行排序。
int[] unsortedArray = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3};
// 对整型数组进行升序排序
Arrays.sort(unsortedArray); 
  • sort(T[] array, Comparator<? super T> c):对对象数组按照自定义比较器进行排序。

填充方法

  • fill():将指定值填充到数组的所有元素或部分元素。
// 创建一个长度为5的整型数组
int[] arr = new int[5];
// 使用Arrays.fill()方法填充数组
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); // 比较两个数组是否完全相等
  • 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<String> list = Arrays.asList(stringArray); // 将字符串数组转换为列表

复制方法

  • copyOf()copyOfRange():复制数组的一部分或全部。
int[] numbers = {100, 200, 300, 400, 500};
int newSize = numbers.length;
// 复制数组并指定新的长度
int[] copiedArray = Arrays.copyOf(numbers, newSize);
System.out.println(Arrays.toString(copiedArray)); // 输出: [100, 200, 300, 400, 500]
​
String[] objectArray = {"A", "B", "C","D","E","F","G"};
int start = 0;
int end = 4;
String[] clonedStringArray = Arrays.copyOfRange(stringArray, start,end);
System.out.println(Arrays.toString(clonedStringArray)); // 输出: [B, C, D]
  • copyOf() 在处理基本类型数组时可以实现深拷贝,但对于对象数组,只复制引用,不复制对象内容。如果需要对象数组的深拷贝,需要自行实现或利用序列化等手段。

打印数组

  • toString():将数组转换为易于阅读的字符串形式。
int[] numbers = {100, 200, 300, 400, 500};
System.out.println(Arrays.toString(numbers)); // 将数组转换为字符串表示形式以便打印