課程:數組

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類的setget方法麳訪問數組元素,當在編譯時刻不知道數組名的時候。除了getset方法,Array類對于原始類型有特定的方法。例如,setInt的參數值是一個intgetBoolean返回的對象是一個boolean類型的包裝類。

示例程序使用setget方法麳拷貝一個數組的內容到另一個數組。

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

相关文章:

  • 2022-02-16
  • 2022-02-20
  • 2021-11-29
  • 2021-09-14
  • 2021-08-16
  • 2021-06-19
猜你喜欢
  • 2021-06-20
  • 2021-09-08
  • 2021-10-03
  • 2021-09-23
  • 2021-12-18
  • 2021-07-11
  • 2021-10-31
相关资源
相似解决方案