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中允許將一個陣列變數複製到另一個陣列變數。這時,兩個變數將引用同一個陣列
如果這樣子進行複製的話,那麼修改任何一個變數的內容,都會引起所有指向該陣列地址的變數發生變化。所起確實希望要搞出來一個新的陣列,就要使用Arrays類的copyOf方法:
第二個引數是新陣列的長度,如果陣列是數值型,那麼新增的元素用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]);
}
}
}
其他的方法
多維陣列
二位陣列也稱矩陣,現在有一個數值表格,用來顯示不同利率下投資10000美元有多少收益,利息每年兌現並復投來熟悉以下所有學過的陣列的方法
程式中用到一個儲存利率的一維陣列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));
C++和java的區別:
- Java陣列與堆疊上的C++陣列有很大的不同。但基本上與在堆上分配的陣列指標一樣。也就是說:
int[] a = new int[100];//java
不同於
int a[100]; //c++
而等同於
int* a = new int[100];//c++
Java中的[]運算子預定義為會完成越界檢查。另外,沒有指標運算,就意味著不能透過a+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個數字的陣列;