前言
本文是橙子出于兴趣爱好对Java官方教程的尝试翻译,几乎每日更新,感兴趣的朋友可以关注一下橙子;翻译过程中尽可能多的对一些关键词保留了英文原文,如果你想看最纯正的英文原版教材却又看不懂,可以试着来看一下橙子的翻译版啊,欢迎大家留言讨论,冲鸭!
更多相关文章点击阅读
Java官方教程目录2020最新版
语言基础
数组 Arrays
数组 Arrays
An array 是一个包含固定数量的单一类型(single type)的容器对象(container object)。创建array时将确定array的长度。创建后,其长度是固定的。在“Hello World” application的main方法中,你已经看到了数组的示例,本节将讨论数组的更多细节。
Array中的每一个item都叫做element。每一个element都可以通过数字索引(numerical index)进行访问。如上图所示,编号从0开始,例如,第9个元素将在index 8处访问。
下面的program,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]);
}
}
program的输出为:
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
在实际编程中,你可能会使用一个循环结构来遍历(iterate through)数组中的每个元素。而不是像示例中单独编写每一行。但该示例清晰的说明了array的语法,你将学习各种循环控制结构 (for, while, and do-while) 在Control Flow 章节。
声明变量去引用数组 Declaring a Variable to Refer to an Array
上面的示例中用以下代码declares 一个名为anArray的array:
// declares an array of integers
int[] anArray;
像声明其它类型的变量一样,declaration 一个 array也有两个部分:the array’s type and the array’s name 。The array的type写作type[ ],其中type是所包含element的类型。方括号[ ]是特殊符号,指示该variable包含一个array。数组的大小不是其类型的一部分,这也是方括号[ ]为空的原因。数组的名称可以是遵循命名规约的任何名称。与其它类型的variable一样,declaration实际上并没有创建一个array;它只是告诉编译器该variable将特定类型的array。
同样,你也可以declare其它type的数组:
byte[] anArrayOfBytes;
short[] anArrayOfShorts;
long[] anArrayOfLongs;
float[] anArrayOfFloats;
double[] anArrayOfDoubles;
boolean[] anArrayOfBooleans;
char[] anArrayOfChars;
String[] anArrayOfStrings;
你也能把方括号[ ]放在array名称后面:
// this form is discouraged
float anArrayOfFloats[];
然而,规约不建议这样做。方括号[ ]标识array type,应该与类型名称(type designation)一起出现。
创建,初始化和访问数组 Creating, Initializing, and Accessing an Array
创建array的方法之一是使用new运算符。ArrayDemo program的下一条语句为一个有10个整形element的array分配(allocate)足够的内存空间,并将该array分配(assign)给anArray variable。
// create an array of integers
anArray = new int[10];
如果缺少此语句(statement),编译器会打印如下错误,并且编译失败:
ArrayDemo.java:4: Variable anArray may not have been initialized.
接下来的几行语句为数组中的每一个element赋值:
anArray[0] = 100; // initialize first element
anArray[1] = 200; // initialize second element
anArray[2] = 300; // and so forth
每一个数组element均通过它的numerical index进行访问:
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]);
或者,你也可以使用快捷语法来create and initialize一个数组:
int[] anArray = {
100, 200, 300,
400, 500, 600,
700, 800, 900, 1000
};
这里数组的length由括号之间用逗号分隔的值的数量决定。
你还可以使用两组或多组括号来declare一个array(多维数组),例如,String[][] names.
因此每个element必须通多对应数量的index value来访问。
在Java语言中,多维数组是一个成分本身为数组的array。这与C或者Fortran的数组不同。这样做的结果是,允许行的长度发生变化,如下面的MultiDimArrayDemo program所示:
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
The System class有一个arraycopy方法,可以有效的将data从一个数组复制到另一个数组。
public static void arraycopy(Object src, int srcPos,
Object dest, int destPos, int length)
两个object参数(arguments)要指定源数组和目标数组。三个int argument指定源数组中的起始位置,目标数组中的起始位置和要复制element的数量。
下面的ArrayCopyDemo程序declare一个char元素数组,拼写单词 “decaffeinated” 。它用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
Arrays是一个强大而有用的概念。Java SE提供了一些方法去执行一些数组中最常见的操作。例如,ArrayCopyDemo的例子使用了System class中的arraycopy方法,而不是手动遍原源数组中的每个element然后放入目标数组。这是在后天执行的,从而使开发人员仅需一行代码来调用方法。
为了方便起见,Java SE在java.util.Arrays class中提供了一系列的方法去操作数组,比如常见的复制,排序,搜索数组等。例如,之前的例子可以改为用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方法的第二个参数是要复制范围的初始索引,第三个参数是要复制范围的最终索引。在此示例中,要复制的范围不包含index 9(a)处的数组元素。
java.util.Arrays类中提供的一些常用操作如下:
- 在数组中搜索特定值并获取该值的索引(the binarySearch method)
- 比较两个数组是否相等(the equals method)
- 为数组中的每个索引分配指定值(the fill method)
- 将数组以升序排序(the sort method or parallelSort method)
年轻人不要不讲武德,进来了点个赞再走啊!