JAVA的陣列基本用法

ivanlee717發表於2024-09-26

array

在宣告陣列變數時,需要指出陣列型別和陣列變數名,例如int[] a;不過這條語句只是宣告瞭變數a,並沒有將a初始化為一個真正的陣列。應該使用new運算子來建立陣列。

int[] a = int[100]或者var a = new int[100]陣列長度不要求是常數

但是一旦建立了陣列,就不能再改變它的長度。不過當然可以改變單個陣列元素。如果程式執行當中需要經常擴充套件陣列的大小,就應該使用另一種資料結構————資料列表ArrayList

可以使用以下兩種形式定義一個陣列變數:

int[] a;或者int a[];

大多數情況都是用前者是因為它可以將型別int[]與變數名清晰的分開

在Java中提供了一種建立陣列物件並同時提供初始值的簡寫形式

int[] arr = {1,2,3,4,5};這種方式不需要使用new,甚至也不需要指定長度。

還可以使用匿名陣列new int[] {1,2,3,4,5},這個表示式會分配一個新陣列並填入大括號中提供的值,他會統計初始值個數,並相應的設定陣列大小。可以使用這種語法重新初始化一個陣列而無需建立新變數,例如:

arr = new int[] {1,2,3,4,5};

for each

Java有一種功能很強的迴圈結構,可以用來一次處理陣列或者任何其他元素集合中的每個元素,而不必考慮指定索引值。這種增強的for迴圈形式如下:

for (variable : collection) statement

它將給定變數設定為集合中的每一個元素,然後執行語句。collection必須是一個陣列或者是實現了Iterable介面的類物件。例如:

for (int element : a){
    System.out.println(element);
}
//這個效果就等同於
for (int i=0; i<a.length;i++){
    System.out.println(a[i]);
}

有一個更容易的方法可以列印陣列中的所有值,就是利用Arrays的toString方法返回一個包含陣列元素的字串,這些元素包圍在中括號內,並用逗號分隔

    public static void main(String[] args){
        int[] a = {1,2,3,4,5};
        System.out.println(Arrays.toString(a));
    } //[1,2,3,4,5]

資料複製

在Java中允許將一個陣列變數複製到另一個陣列變數。這時,兩個變數將引用同一個陣列

image-20240926110138036

如果這樣子進行複製的話,那麼修改任何一個變數的內容,都會引起所有指向該陣列地址的變數發生變化。所起確實希望要搞出來一個新的陣列,就要使用Arrays類的copyOf方法:

image-20240926110924888

第二個引數是新陣列的長度,如果陣列是數值型,那麼新增的元素用0不起,如果陣列元素是布林型,則填入false。相反如果新陣列長度較短,只複製前面的值。

命令列引數

每一個Java程式都有一個帶String arg[]引數的main方法。這個參數列明main方法接受一個字串陣列,這個是透過命令列敲進去的。比如下列這個程式

public class Main {
    public static void main(String[] args) {
        if (args.length == 0 || args[0].equals("-h")) {
            System.out.print("hello, ");

        } else if (args[0].equals("-g")) {
            System.out.print("Goodbye, ");
        }
        for (int i = 1; i < args.length; i++) {
            System.out.print(" " + args[i]);
        }
    }
}

image-20240926112638215

其他的方法

image-20240926113609788

多維陣列

二位陣列也稱矩陣,現在有一個數值表格,用來顯示不同利率下投資10000美元有多少收益,利息每年兌現並復投來熟悉以下所有學過的陣列的方法

image-20240926114725382image-20240926114822763

程式中用到一個儲存利率的一維陣列interest和一個儲存賬戶餘額的二維陣列balances(對應每年和利率分別有一個餘額),double[][] balances = new double[NYEARS][NRATES]; 使用初始餘額來初始化這個陣列的第一行:

for (int j = 0; j < balances[0].length; j++) {
    balances[0][j] = 10000;
}

然後計算其他行:

for (int i = 1; i < balances.length; i++) {
    for (int j = 0; j < balances[i].length; j++) {
        double OldBalance = balances[i - 1][j];

        double interest = OldBalance * interestRate[j];

        balances[i][j] = OldBalance + interest;
    }
}

完整程式如下:

public class Main {
    public static void main(String[] args) {
        final double STARTRATE = 10;
        final int NYEARS = 10;
        final int NRATES = 6;
        // 設定利率為10%->15%
        double[] interestRate = new double[NRATES];
        for (int j = 0; j < interestRate.length; j++) {
            interestRate[j] = (STARTRATE + j) / 100.0;
        }

        double[][] balances = new double[NYEARS][NRATES];
        // 設定初始的利潤為10000
        for (int j = 0; j < balances[0].length; j++) {
            balances[0][j] = 10000;
        }

        // 計算利息
        for (int i = 1; i < balances.length; i++) {
            for (int j = 0; j < balances[i].length; j++) {
                double OldBalance = balances[i - 1][j];

                double interest = OldBalance * interestRate[j];

                balances[i][j] = OldBalance + interest;
            }
        }

        for (int j = 0; j < interestRate.length; j++) {
            System.out.printf("%9.0f%%", 100 * interestRate[j]);
        }
        System.out.println();
        for (double[] row : balances) {
            for (double b : row) {
                System.out.printf("%10.2f", b);

            }
            System.out.println();
        }

    }
}

想要快速列印一個二維陣列,可以直接呼叫Arrays的deepToString方法生成

System.out.println(Arrays.deepToString(balances));

image-20240926142014929

C++和java的區別:

  1. Java陣列與堆疊上的C++陣列有很大的不同。但基本上與在堆上分配的陣列指標一樣。也就是說:

int[] a = new int[100];//java

不同於

int a[100]; //c++

而等同於

int* a = new int[100];//c++

Java中的[]運算子預定義為會完成越界檢查。另外,沒有指標運算,就意味著不能透過a+1得到陣列中的下一個元素。

  1. 在C++中,Java宣告的

double[][] balances = new double[10][6];//java

不同於

double balances[10][6]//C++

也不同於

double (*balances)[6] = new balances[10][6]'//C++

而是分配了一個包含10個指標的陣列;

double** balances = new double*[10];

然後這個指標陣列的每一個元素會填充一個包含6個數字的陣列;

相關文章