Arrays
数组是一个包含固定数量的单一类型值的容器对象。创建数组时将确定数组的 Long 度。创建后,其 Long 度是固定的。您已经在“ Hello World!”的main
方法中看到了数组的示例。应用。本节将更详细地讨论数组。
10 个元素的数组。
数组中的每个项目都称为一个元素,每个元素都可以通过其数字索引进行访问。如上图所示,编号从 0 开始。例如,第 9 个元素将在索引 8 处访问。
下面的程序ArrayDemo创建一个整数数组,在该数组中放入一些值,并将每个值打印到标准输出中。
class ArrayDemo {
public static void main(String[] args) {
// declares an array of integers
int[] anArray;
// allocates memory for 10 integers
anArray = new int[10];
// initialize first element
anArray[0] = 100;
// initialize second element
anArray[1] = 200;
// and so forth
anArray[2] = 300;
anArray[3] = 400;
anArray[4] = 500;
anArray[5] = 600;
anArray[6] = 700;
anArray[7] = 800;
anArray[8] = 900;
anArray[9] = 1000;
System.out.println("Element at index 0: "
+ anArray[0]);
System.out.println("Element at index 1: "
+ anArray[1]);
System.out.println("Element at index 2: "
+ anArray[2]);
System.out.println("Element at index 3: "
+ anArray[3]);
System.out.println("Element at index 4: "
+ anArray[4]);
System.out.println("Element at index 5: "
+ anArray[5]);
System.out.println("Element at index 6: "
+ anArray[6]);
System.out.println("Element at index 7: "
+ anArray[7]);
System.out.println("Element at index 8: "
+ anArray[8]);
System.out.println("Element at index 9: "
+ anArray[9]);
}
}
该程序的输出为:
Element at index 0: 100
Element at index 1: 200
Element at index 2: 300
Element at index 3: 400
Element at index 4: 500
Element at index 5: 600
Element at index 6: 700
Element at index 7: 800
Element at index 8: 900
Element at index 9: 1000
在实际编程情况下,您可能会使用受支持的循环结构之一来遍历数组的每个元素,而不是像前面的示例中那样单独编写每一行。但是,该示例清楚地说明了数组语法。您将在Control Flow部分中了解各种循环结构(for
,while
和do-while
)。
声明变量以引用数组
前面的程序用下面的代码行声明一个数组(名为anArray
):
// declares an array of integers
int[] anArray;
像其他类型变量的声明一样,数组声明也包含两个部分:数组的类型和数组的名称。数组的类型写为type[]
,其中type
是所包含元素的数据类型;方括号是特殊符号,指示此变量包含一个数组。数组的大小不是其类型的一部分(这就是括号为空的原因)。数组的名称可以是您想要的任何名称,只要它遵循前面naming部分中讨论的规则和约定即可。与其他类型的变量一样,该声明实际上并不创建数组。它只是告诉编译器该变量将保存指定类型的数组。
同样,您可以声明其他类型的数组:
byte[] anArrayOfBytes;
short[] anArrayOfShorts;
long[] anArrayOfLongs;
float[] anArrayOfFloats;
double[] anArrayOfDoubles;
boolean[] anArrayOfBooleans;
char[] anArrayOfChars;
String[] anArrayOfStrings;
您也可以将方括号放在数组名称的后面:
// this form is discouraged
float anArrayOfFloats[];
然而,惯例不鼓励这种形式。括号标识阵列类型,并应与类型名称一起出现。
创建,初始化和访问阵列
创建数组的一种方法是使用new
运算符。 ArrayDemo
程序中的下一条语句为具有 10 个整数元素的足够内存分配一个数组,并将该数组分配给anArray
变量。
// create an array of integers
anArray = new int[10];
如果缺少此语句,则编译器将输出如下错误,并且编译失败:
ArrayDemo.java:4: Variable anArray may not have been initialized.
接下来的几行将值分配给数组的每个元素:
anArray[0] = 100; // initialize first element
anArray[1] = 200; // initialize second element
anArray[2] = 300; // and so forth
每个数组元素均通过其数字索引进行访问:
System.out.println("Element 1 at index 0: " + anArray[0]);
System.out.println("Element 2 at index 1: " + anArray[1]);
System.out.println("Element 3 at index 2: " + anArray[2]);
另外,您可以使用快捷方式语法创建和初始化数组:
int[] anArray = {
100, 200, 300,
400, 500, 600,
700, 800, 900, 1000
};
在这里,数组的 Long 度由括号之间提供的值的数量确定,并用逗号分隔。
您还可以通过使用两组或更多组括号(例如String[][] names
)来声明数组数组(也称为*多维数组)。因此,必须通过相应数量的索引值来访问每个元素。
在 Java 编程语言中,多维数组是一个数组,其组件本身就是数组。这与 C 或 Fortran 中的数组不同。结果是,允许行的 Long 度不同,如下面的MultiDimArrayDemo程序所示:
class MultiDimArrayDemo {
public static void main(String[] args) {
String[][] names = {
{"Mr. ", "Mrs. ", "Ms. "},
{"Smith", "Jones"}
};
// Mr. Smith
System.out.println(names[0][0] + names[1][0]);
// Ms. Jones
System.out.println(names[0][2] + names[1][1]);
}
}
该程序的输出为:
Mr. Smith
Ms. Jones
最后,您可以使用内置的length
属性来确定任何数组的大小。以下代码将数组的大小打印到标准输出中:
System.out.println(anArray.length);
Copying Arrays
System
类具有arraycopy
方法,可用于有效地将数据从一个数组复制到另一个数组:
public static void arraycopy(Object src, int srcPos,
Object dest, int destPos, int length)
两个Object
参数指定要从中复制的数组和要复制到的数组。三个int
参数指定源数组中的起始位置,目标数组中的起始位置以及要复制的数组元素的数量。
下面的程序ArrayCopyDemo声明了一个char
元素的数组,拼写了单词“脱除 Caffeine”。它使用System.arraycopy
方法将数组组件的子序列复制到第二个数组中:
class ArrayCopyDemo {
public static void main(String[] args) {
char[] copyFrom = { 'd', 'e', 'c', 'a', 'f', 'f', 'e',
'i', 'n', 'a', 't', 'e', 'd' };
char[] copyTo = new char[7];
System.arraycopy(copyFrom, 2, copyTo, 0, 7);
System.out.println(new String(copyTo));
}
}
该程序的输出为:
caffein
Array Manipulations
数组是编程中使用的强大而有用的概念。 Java SE 提供了一些方法来执行一些与数组有关的最常见操作。例如,ArrayCopyDemo示例使用System
类的arraycopy
方法,而不是手动遍历源数组的元素并将每个元素放入目标数组。这是在后台执行的,从而使开发人员可以仅使用一行代码来调用该方法。
为了方便起见,Java SE 提供了几种在java.util.Arrays类中执行数组操作(常见任务,例如复制,排序和搜索数组)的方法。例如,可以将上一个示例修改为使用java.util.Arrays
类的copyOfRange
方法,如ArrayCopyOfDemo示例所示。区别在于使用copyOfRange
方法不需要在调用该方法之前创建目标数组,因为目标数组是由该方法返回的:
class ArrayCopyOfDemo {
public static void main(String[] args) {
char[] copyFrom = {'d', 'e', 'c', 'a', 'f', 'f', 'e',
'i', 'n', 'a', 't', 'e', 'd'};
char[] copyTo = java.util.Arrays.copyOfRange(copyFrom, 2, 9);
System.out.println(new String(copyTo));
}
}
如您所见,该程序的输出是相同的(caffein
),尽管它需要更少的代码行。请注意,copyOfRange
方法的第二个参数是要复制的范围的初始索引(包括两个端点),而第三个参数是要复制的范围的final索引(包括*)。在此示例中,要复制的范围不包括索引 9 处的数组元素(其中包含字符a
)。
java.util.Arrays
类中的方法提供的一些其他有用的操作是:
-
在数组中搜索特定值以获取放置该值的索引(
binarySearch
方法)。 -
比较两个数组以确定它们是否相等(
equals
方法)。 -
填充数组以在每个索引处放置特定值(
fill
方法)。 -
将数组按升序排序。可以使用
sort
方法 Sequences 进行此操作,也可以使用 Java SE 8 中引入的parallelSort
方法同时进行。multiprocessing 器系统上大型数组的并行排序比 Sequences 数组排序要快。