數組
翻譯自ORACLE Java Tutorials –Arrays
數組是一個容器對象,它保存單個類型的固定數量的值。 創建數組時,建立數組的長度。 創建後,其長度是固定的。 你已經看到了一個數組的例子,在“Hello World!”的主要方法中。 應用。 本節將更詳細地討論數組。
數組中的每個項目稱爲元素,每個元素都由其數字索引訪問。 如上圖所示,編號從0開始。例如,第9個元素將在索引8處被訪問。
以下程序ArrayDemo創建一個整數數組,在數組中放置一些值,並將每個值打印到標準輸出。
class ArrayDemo {
public static void main(String[] args) {
// 聲明爲整數數組
int[] anArray;
//給十個整數分配內存
anArray = new int[10];
// 初始化第一個元素
anArray[0] = 100;
// 初始化第二個元素
anArray[1] = 200;
// 等等
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
在現實世界的編程情境中,您可能會使用支持的循環結構之一來遍歷數組的每個元素,而不是像前面的示例一樣單獨寫入每一行。 但是,該示例清楚地說明了數組語法。 您將在“控制流程”部分中瞭解各種循環結構(for,while和do-while)。
聲明一個變量來引用一個數組
下面程序使用以下代碼行聲明一個數組(名爲anArray):
// 聲明一個整數數組
int[] anArray;
像其他類型的變量聲明一樣,數組聲明有兩個組件:數組的類型和數組的名稱。 數組的類型寫爲type [],其中type是包含元素的數據類型; 括號是指示此變量保存數組的特殊符號。 數組的大小不是其類型的一部分(這就是爲什麼括號爲空)。 數組的名稱可以是任何您想要的名稱,只要它遵循以前在命名部分中討論的規則和約定。 與其他類型的變量一樣,聲明實際上並不創建數組; 它只是告訴編譯器這個變量將保存一個指定類型的數組。
類似地,您可以聲明其他類型的數組:
byte[] anArrayOfBytes;
short[] anArrayOfShorts;
long[] anArrayOfLongs;
float[] anArrayOfFloats;
double[] anArrayOfDoubles;
boolean[] anArrayOfBooleans;
char[] anArrayOfChars;
String[] anArrayOfStrings;
您也可以在數組名稱後放置括號:
//這個方式是不鼓勵的
float anArrayOfFloats [];
然而,習慣上不鼓勵這種形式; 括號標識數組類型,並應顯示類型名稱。
創建,初始化和訪問數組
創建數組的一種方法是使用新的運算符。 ArrayDemo程序中的下一個語句爲10個整數元素分配一個具有足夠內存的數組,並將數組分配給anArray變量。
//創建一個整數數組
anArray = new int [10];
如果此語句丟失,則編譯器將打印如下所示的錯誤,並且編譯失敗:
ArrayDemo.java:4: Variable anArray may not have been initialized.
接下來的幾行將值分配給數組的每個元素:
anArray [0] = 100; //初始化第一個元素
anArray [1] = 200; //初始化第二個元素
aArray [2] = 300; //等等
每個數組元素都由其數字索引訪問:
System.out.println(“索引號爲0的元素1”+ anArray [0]);
System.out.println(“Index 2 at index 1:”+ anArray [1]);
System.out.println(“索引2中的元素3:”+ anArray [2]);
或者,您可以使用快捷方式語法來創建和初始化數組:
int[] anArray = {
100, 200, 300,
400, 500, 600,
700, 800, 900, 1000
};
這裏,數組的長度由大括號之間提供的值的數量確定,並用逗號分隔。
您還可以通過使用兩個或更多個括號(例如String [] []名稱來聲明數組數組(也稱爲多維數組)。 因此,每個元素必須由相應數量的索引值訪問。
在Java編程語言中,多維數組是一個數組,其組件本身就是數組。 這與C或Fortran中的數組不同。 這樣做的結果是允許行的長度變化,如下面的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);
複製數組
System類有一個arraycopy方法,您可以使用它來有效地將數據從一個數組複製到另一個數組:
public static void arraycopy(Object src, int srcPos,
Object dest, int destPos, int length)
兩個Object參數指定要複製的數組和要複製的數組。三個int參數指定源數組中的起始位置,目標數組中的起始位置和要複製的數組元素的數量。
以下程序,ArrayCopyDemo,聲明一個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
數組操作
數組是用於編程的強大而有用的概念。 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方法的第二個參數是要複製的範圍的初始索引,包括第三個參數是要複製的範圍的最終索引。在此示例中,要複製的範圍不包括索引9(包含字符a)的數組元素。
java.util.Arrays類中的方法提供的一些其他有用的操作是:
- 搜索數組以獲取特定值以獲取其放置的索引(binarySearch方法)。
- 比較兩個數組以確定它們是否相等(equals方法)。
- 填充數組以在每個索引中放置一個特定的值。(fill方法)
- 將數組排列成升序。這可以使用sort方法或並行使用Java SE 8中引入的parallelSort方法順序完成。多處理器系統上的大型數組的並行排序比順序數組排序更快。(parallelSort方法)