自学内容网 自学内容网

【Java SE】数组概述

数组是一种数据结构,用来存储同一类型值的集合。通过索引的方式可以访问数组中的元素值。例如存在一个整数数组arr,则arr[i]就是数组中索引下标为i的整数。根据数组的维数可将数组分为一维数组和多维数组(包括二维数组)。

一、数组声明

在使用数组之前,需要声明一个数组。声明的方式有两种,一种是先声明再初始化,另一种是声明的同时初始化。这里以一维数组为例:

(1)先声明再初始化

int[] arr;
arr = new int[5];

(2)声明同时初始化

int[] arr = new int[5];

注意:数组在初始化的过程中,可以采用动态初始化或静态初始化的方式。上面采用new的方式属于动态初始化。静态初始化方式在一维数组部分进行介绍。另外,在声明过程中,定义数组类型的方式其实有两种,如下所示。

// 方式一:数据类型[] 数组名;(推荐)
int[] arr;

// 方式二:数据类型 数组名[];
int arr[];

二、一维数组

一维数组实际上是一组相同类型数据的线性集合,数组作为对象允许使用new关键字进行内存分配(动态初始化),也允许提供初始值的创建方式(静态初始化)。

(1)动态初始化

与数组声明部分描述的一样,动态创建一维数组分为先声明再初始化和声明的同时初始化这两种方式。动态创建数组后,数组中每个元素存放相关数据类型的默认值,如int类型的数组动态初始化后,每个位置存放的值为int类型的默认值0。具体代码实现如下:

// 方式一:先声明,再用 `new` 进行内存分配
int[] arr1;
arr1 = new int[5];

// 声明的同时用 `new` 进行内存分配
int[] arr2 = new int[5];

(2)静态初始化

在创建数组的过程中,为数组提供指定初始值的方式称为静态初始化。静态初始化一维数组也有两种形式,这两种形式会自动统计初始化值个数,并相应地设置数值大小,具体代码实现如下:

// 形式一
int[] arr1 = new int[]{1, 2, 3};

// 形式二
int[] arr2 = {1, 2, 3};

三、多维数组

这里以二维数组为例对多维数组声明和初始化进行说明。二维数组可以看作是特殊的一维数组,因此,多维数组的创建与一维数组类似。

(1)动态初始化

// 方式一
int[][] arr1;
arr1 = new int[2][4];

// 方式二
int[][] arr1 = new int[2][4];

(2)静态初始化

// 方式一
int[][] arr1 = new int[][]{{1, 2}, {3, 4, 5}};
// 方式二
int[][] arr2 = {{1, 2}, {3, 4, 5}};

四、不规则数组

与多维数组类似,不规则数组存在多个维度,不同的是不规则数组在一些维度上没有固定的长度。这里以二维数组为例,构造一个不规则数组,即数组的每一行有不同的长度。

int[][] arr1;
arr1 = new int[2][];
arr1[0] = new int[2];
arr1[1] = new int[3];

五、数组操作

常见的数组操作包括:数组元素遍历、数组元素填充、数组元素排序、数组元素复制、数组元素查询和数组元素比较。

(1)数组元素遍历

数组元素从0开始编号,在访问数组时,可以基于索引进行遍历,也可以用增强for循环的形式进行遍历。增强for循环依次处理数组中的每个元素,而不必考虑指定索引值。

// 增强for循环格式:for (variable : collection) statement
int[][] arr = new int[][]{{1, 2}, {3, 4, 5}};
for (int[] ints : arr) {
    for (int j = 0; j < ints.length; j++) {
        System.out.println(ints[j]);
    }
}

(2)数组元素填充

通常使用Arrays类的fill方法进行数组元素填充。

// 方式一: Arrays.fill(xxx[] a, xxx val)
// a: 要进行元素替换的数组
// val: 要存储在数组所有元素中的值

int arr = new int[5];
Arrays.fill(arr, 8);
// 方式二: Arrays.fill(xxx[] a, int from, int to, xxx val)
// a: 要进行元素替换的数组
// from: 要使用指定值填充的第一个元素索引(包括)
// to: 要使用指定值填充的最后一个元素索引(不包括)
// val: 要存储在数组所有元素中的值

int arr = new int[5];
Arrays.fill(arr, 1, 2, 8);

(3)数组元素排序

通常使用Arrays类的sort方法进行排序。这个方法使用了优化的快速排序算法。

// Arrays.sort(xxx[] a)
int[] arr = new int[]{100, 456, 123, 789};
Arrays.sort(arr);

(4)数组元素复制

Java中,允许将一个数组变量拷贝到另一个数组变量。这时两个变量将引用同一个数组(浅拷贝)。为了实现深拷贝,通常使用Arrays类的copyOf(int[] arr, int newLen)方法进行复制,以创建新数组。

// Arrays.copyOf(xxx[] arr, int newLen)
// arr: 要进行复制的数组
// newLen: 新数组的长度,若大于数组arr的长度,则填充0填充(根据数据类型填充,如整数用0填充,char用null填充) 

int[] arr1 = new int[]{1, 2, 3};
int[] newArr1 = Arrays.copyOf(arr1, 5);
// Arrays.copyOfRange(xxx[] arr, int from, int to)
// arr: 要进行复制的数组
// from: 开始复制的元素索引(包括)
// to: 结束复制的元素索引(不包括)

int[] arr2 = new int[]{1, 2, 3};
int[] newArr2 = Arrays.copyOfRange(arr2, 0, 3);

(5)数组元素查询

通常使用Arrays类的binarySearch方法对数组进行二分搜索,查找某个值是否存在于数组中。需要注意的是,在使用该方法前,需要确保数组是有序的。

// 使用Arrays.binarySearch(xxx[] a, xxx v)方法
// 若v存在则返回对应索引
// 否则返回一个负数r,-r-1是v应该插入的位置(确保a有序)
int[] arr = new int[]{100, 123, 456, 789};
int idx = Arrays.binarySearch(arr, 456);
// 使用Arrays.binarySearch(xxx[] a, int start, int end, xxx v)方法
// 在[start, end)中查找v,返回结果与前者一致
int[] arr = new int[]{100, 123, 456, 789};
int idx = Arrays.binarySearch(arr, 1, 3, 456);

(6)数组元素比较

通常使用Arrays类的equals方法对数组进行比较。如果两个数组长度相同,并且相同索引对应的元素都相同,则返回true

// 使用Arrays.equals(xxx[] a, xxx[] b)方法
int[] a = new int[]{1, 2, 3};
int[] b = new int[]{1, 2, 3};
System.out.println(Arrays.equals(a, b));

六、使用细节

(1)一旦创建数组,就不能改变它的长度(但可以改变单个数组元素)。

(2)数组中元素可以是任意类型,包括基本类型和引用类型,但不能混用。

(3)数组的下标是从0开始的,下标必须在指定范围内使用,避免出现下标越界异常。

(4)数组属于引用类型,数组型数据是对象(Object)。


原文地址:https://blog.csdn.net/zzy_NIC/article/details/143590498

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!