18.4.4 操作数组

18.4.4 操作数组

java.lang.reflect包下还提供了一个Array类,Array对象可以代表所有的数组。

Array有什么有用

程序可以通过使用Array来动态地创建数组,操作数组元素等.

Array类方法

Array提供了如下几类方法。

方法 描述
static Object newInstance(Class<?> componentType,int ... length) 创建一个具有指定的元素类型、指定维度的新数组.
static Object get(Object array, int index) 返回array数组中第index个元素, 类型为Object
static void set(Object array, int index, Object value) array数组中第index个元素的值设为value
static Xxx getXxx(Object array, int index) 返回array数组中第index个元素,其中Xxx指的是各种基本数据类型。
static void setXxx(Object array, int index,Xxx value) array数组中第index个元素的值设为value,其中Xxx指的是各种基本数据类型

程序示例 Array创建一维数组

下面程序示范了如何使用Array来生成数组,为指定数组元素赋值,并获取指定数组元素的方式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.lang.reflect.*;

public class ArrayTest1
{
public static void main(String args[])
{
try
{
// 创建一个元素类型为String ,长度为10的数组
Object arr = Array.newInstance(String.class, 10);
// 依次为arr数组中index为5、6的元素赋值
Array.set(arr, 5, "这是一个字符串");
Array.set(arr, 6, "这还是一个字符串");
// 依次取出arr数组中index为5、6的元素的值
Object book1 = Array.get(arr , 5);
Object book2 = Array.get(arr , 6);
// 输出arr数组中index为5、6的元素
System.out.println(book1);
System.out.println(book2);
}
catch (Throwable e)
{
System.err.println(e);
}
}
}

运行结果:

1
2
这是一个字符串
这还是一个字符串

上面程序中分别通过Array创建数组,为数组元素设置值,访问数组元素的值的示例代码,程序通过使用Array就可以动态地创建并操作数组。

程序示例 Array创建多维数组

下面程序比上面程序稍微复杂一点,下面程序使用Array类创建了一个三维数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import java.lang.reflect.*;

public class ArrayTest2
{
public static void main(String args[])
{
/*
创建一个三维数组。
根据前面介绍数组时讲的:三维数组也是一维数组,
是数组元素是二维数组的一维数组,
因此可以认为arr是长度为3的一维数组
*/
Object arr = Array.newInstance(String.class, 3, 4, 10);//代码段1
// 获取三维数组arr中index为2的元素,该元素应该是二维数组
Object arrObj = Array.get(arr, 2);
// 使用Array为二维数组的数组元素赋值。二维数组的数组元素是一维数组,
// 所以传入Array的set()方法的第三个参数是一维数组。
// 代码段2
Array.set(arrObj , 2 , new String[]
{
"这是一个字符串",
"这又是一个字符串"
});

// 获取二维数组arrObj中index为3的元素,该元素应该是一维数组。
Object anArr = Array.get(arrObj, 3);
Array.set(anArr , 8 , "这还是一个字符串");
// 将arr强制类型转换为三维数组
String[][][] cast = (String[][][])arr;
// 获取cast三维数组中指定元素的值
System.out.println(cast[2][3][8]);
System.out.println(cast[2][2][0]);
System.out.println(cast[2][2][1]);
}
}

上面程序的代码段1使用Array创建了一个三维数组,程序中较难理解的地方是代码段2这部分,使用ArrayarrObj的指定元素赋值,相当于为二维数组的元素赋值。由于二维数组的元素是一维数组,所以程序传入的参数是一个一维数组对象。
运行上面程序,将看到cast[2][3][8]cast[2][2][0]cast[2][2][1]]元素都有值,这些值就是刚才程序通过反射传入的数组元素值。

本文重点

  • 使用ArraynewInstance这个静态方法可以创建数组,
  • 该方法的第一个参数,是数组的类型,
    • 第二分变长参数的个数表示数组的维度,
      • 如果有一个变长参数,表示创建一维数组,
      • 如果有多个变长参数,则表示创建多维数组.
    • 变长参数的大小表示数组的长度.
  • Array方法提供getset方法通过下标访问数组元素,但是要注意的是多维数组的情况:
    • 由于二维数组的元素是一维数组,则此时的通过下标来访问的get,或者set方法,访问到的是一维数组.
    • 由于三维数组的元素时二维数组,则测试通过访问的get,set方法访问到的是二维数组.