課程:數組
Array類提供了一種方法,這種方法允許你動態創建和訪問數組。這一節課你將要學到如何使用這些方法。
指定數組
這一節向您展示如何處理當對象是一個數組的時候。
如果你不確定一個特定的對象是一個數組,你可以通過Class.isArray方法麳檢查以下。嚷我們麳看一個例子。
這個示例程序打印數組的名字,這個數組被封裝成一個對象。這個程序執行以下幾步:
1. 它返回Class對象。
2. 獲得Field對象。
3. 對每一個Field對象,程序獲得相應的Class對象通過調用getType方法。
4. 驗證前面步驟返回的Class對象是數組,這個程序調用isArray方法。
以下是源代碼:
import java.lang.reflect.*;
import java.awt.*;
class SampleArray {
public static void main(String[] args) {
KeyPad target = new KeyPad();
printArrayNames(target);
}
static void printArrayNames(Object target) {
Class targetClass = target.getClass();
Field[] publicFields = targetClass.getFields();
for (int i = 0; i < publicFields.length; i++) {
String fieldName = publicFields[i].getName();
Class typeClass = publicFields[i].getType();
String fieldType = typeClass.getName();
if (typeClass.isArray()) {
System.out.println("Name: " + fieldName +
", Type: " + fieldType);
}
}
}
}
class KeyPad {
public boolean alive;
public Button power;
public Button[] letters;
public int[] codes;
public TextField[] rows;
public boolean[] states;
}
輸出如下:
Name: letters, Type: [Ljava.awt.Button;
Name: codes, Type: [I
Name: rows, Type: [Ljava.awt.TextField;
Name: states, Type: [Z
返回組件類型
如果你想發現數組的類型,你將要從這一節的示例中學到。
組件類型是數組元素的類型。例如,arrowKeys數組的組件類型在以下代碼中是Button類型:
Button[] arrowKeys = new Button[4];
通過調用getComponentType方法返回數組元素的組件類型。
示例程序調用getComponentType方法幷且打印出數組中每一個元素的類名。
import java.lang.reflect.*;
import java.awt.*;
class SampleComponent {
public static void main(String[] args) {
int[] ints = new int[2];
Button[] buttons = new Button[6];
String[][] twoDim = new String[4][5];
printComponentType(ints);
printComponentType(buttons);
printComponentType(twoDim);
}
static void printComponentType(Object array) {
Class arrayClass = array.getClass();
String arrayName = arrayClass.getName();
Class componentClass = arrayClass.getComponentType();
String componentName = componentClass.getName();
System.out.println("Array: " + arrayName +
", Component: " + componentName);
}
}
輸出:
Array: [I, Component: int
Array: [Ljava.awt.Button;, Component: java.awt.Button
Array: [[Ljava.lang.String;, Component: [Ljava.lang.String;
創建數組
這一節將要向您展示在運行時創建數組是多麽的簡單。
如果你正在編寫一個例如應用程序構建器的開發工具,你可能想要允許用戶在運行時創建數組。你的程序可以通過Array.newInstance方法提供這個特性。
以下示例程序使用newInstance方法麳創建一個數組的拷貝,這個數組大小是原來數組的兩倍。newInstance方法接受新數組的長度和組件類型。以下是源代碼:
import java.lang.reflect.*;
class SampleCreateArray {
public static void main(String[] args) {
int[] originalArray = {55, 66};
int[] biggerArray = (int[]) doubleArray(originalArray);
System.out.println("originalArray:");
for (int k = 0; k < Array.getLength(originalArray); k++)
System.out.println(originalArray[k]);
System.out.println("biggerArray:");
for (int k = 0; k < Array.getLength(biggerArray); k++)
System.out.println(biggerArray[k]);
}
static Object doubleArray(Object source) {
int sourceLength = Array.getLength(source);
Class arrayClass = source.getClass();
Class componentClass = arrayClass.getComponentType();
Object result = Array.newInstance(componentClass,
sourceLength * 2);
System.arraycopy(source, 0, result, 0, sourceLength);
return result;
}
}
輸出:
originalArray:
55
66
biggerArray:
55
66
0
0
你也可以使用newInstance方法麳創建多維數組。在這個情况下,方法的參數是新數組維數的組件類型和int類型的數組。
以下程序展示如何使用newInstance麳創建多維數組:
import java.lang.reflect.*;
class SampleMultiArray {
public static void main(String[] args) {
// The oneDimA and oneDimB objects are one
// dimensional int arrays with 5 elements.
int[] dim1 = {5};
int[] oneDimA = (int[]) Array.newInstance(int.class, dim1);
int[] oneDimB = (int[]) Array.newInstance(int.class, 5);
// The twoDimStr object is a 5 X 10 array of String objects.
int[] dimStr = {5, 10};
String[][] twoDimStr =
(String[][]) Array.newInstance(String.class,dimStr);
// The twoDimA object is an array of 12 int arrays. The tail
// dimension is not defined. It is equivalent to the array
// created as follows:
// int[][] ints = new int[12][];
int[] dimA = {12};
int[][] twoDimA = (int[][]) Array.newInstance(int[].class, dimA);
}
}
獲得和設置元素的值
即使你直到運行時才直到數組名字,你也可以檢查或者修改它元素的值。這一節將要告訴你如何來做。
在許多程序中,訪問數組元素你只是通過賦值表達式麳做:
int[10] codes;
codes[3] = 22;
aValue = codes[3];
如果你在運行時才直到數組的名稱的時候這種方式是不可行的。
幸運的是,你可以使用Array類的set和get方法麳訪問數組元素,當在編譯時刻不知道數組名的時候。除了get和set方法,Array類對于原始類型有特定的方法。例如,setInt的參數值是一個int,getBoolean返回的對象是一個boolean類型的包裝類。
示例程序使用set和get方法麳拷貝一個數組的內容到另一個數組。
import java.lang.reflect.*;
class SampleGetArray {
public static void main(String[] args) {
int[] sourceInts = {12, 78};
int[] destInts = new int[2];
copyArray(sourceInts, destInts);
String[] sourceStrgs = {"Hello ", "there ", "everybody"};
String[] destStrgs = new String[3];
copyArray(sourceStrgs, destStrgs);
}
public static void copyArray(Object source, Object dest) {
for (int i = 0; i < Array.getLength(source); i++) {
Array.set(dest, i, Array.get(source, i));
System.out.println(Array.get(dest, i));
}
}
}
輸出:
12
78
Hello
there
everybody