Java Arrays数组和相关方法
数组是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)); // 将数组转换为字符串表示形式以便打印
转载自:https://juejin.cn/post/7357977599128485939