數組
- 一旦創建了數組,就不能改變大小;爲了擴展數組的大小,應使用另一種數據結構——數組列表 ( array list )。
- foreach 循環可以依次處理元素集合的每個元素而不用爲下標擔心,尤其在需要處理集合中的所有元素時更加方便。
int[] a = { 1, 3, 5, 7, 9 };
for (int i : a) {
System.out.print(i + " ");
}
//輸出 1 3 5 7 9
- 有個更簡單的打印數組中的所有的值,即利用 Array 類的 toString 方法:
int[] a = { 1, 2, 3, 4, 5 };
System.out.println(Arrays.toString(a));
/*
* 輸出 [1, 2, 3, 4, 5]
* 注意是Arrays.toString(a),而不是a.toString!!!
*/
- Java 中的 [ ] 運算符被預定義爲檢查數組邊界,而且沒有指針運算,即不能通過 a 加 1 得到數組的下一個元素。
- Java 數組與 C++ 的數組有很大不同,但基本和 C++ 的指針數組一樣。
1、數組拷貝
- 在 Java 中,將一個數組變量拷貝給另一個數組變量,這時兩個變量將引用同一個數組!
int[] a = { 1, 2, 3, 4, 5 };
int[] b = a;
b[3] = 12;
System.out.println(a[3]);
// 輸出 12 ,說明此時兩變量指向同一個數組!
- 數組值的完全拷貝和擴展數組,可以使用 Arrays 類的 copyOf 方法:
int[] a = { 1, 2, 3, 4, 5 };
int[] b = Arrays.copyOf(a, 2 * a.length);
System.out.println(Arrays.toString(b));
// 輸出 [1, 2, 3, 4, 5, 0, 0, 0, 0, 0]
2、有意思的命令行參數
- 每一個 Java 程序都有一個帶 String arg[]參數的 main 方法。這個參數表明 main 方法將接受一個字符串數組,也就是命令行參數。
- 在 main 方法中,程序名並沒有存儲在 args 數組中。
public class Message {
public static void main(String[] args) {
if (args[0].equals("-h"))// 字符串比較不用 ==
System.out.println("hello:");
for (String i : args)
System.out.println(i);
for (int i = 0;i < args.length; i++)
System.out.println(args[i]);
}
}
3、數組排序
- 對數值型數組進行排序,可以使用 Arrays 類的 sort 方法:
int[] a = { 1, 9, 5, 7, 2, 4, 10 };
Arrays.sort(a);
for (int i : a) {
System.out.print(i + " ");
}//輸出 1 2 4 5 7 9 10
4、多維數組
- 要想快速打印一個二維數組的數據元素列表,可以使用 Arrays 類的 deepToString 方法:
int[][] a = { { 1, 9, 5 }, { 7, 2, 4 }, { 10, 34, 45 }, };
System.out.println(Arrays.deepToString(a));
//輸出 [[1, 9, 5], [7, 2, 4], [10, 34, 45]]
- for each 循環語句不能自動處理二維數組的每一個元素,需要使用兩個嵌套的循環:
int[][] a = { { 1, 9, 5 }, { 7, 2, 4 }, { 10, 34, 45 } };
for (int[] row : a)
for (int i : row)
System.out.print(i + " ");
// 輸出 1 9 5 7 2 4 10 34 45
5、不規則數組
Java 的優勢: java 實際上沒有多維數組,只有一維數組,多維數組被解釋成“數組的數組”
- 由於可以單獨的存取數據的某一行,所以可以讓兩行交換:
int[][] a = { { 1, 9, 5 }, { 7, 2, 4 }, { 10, 34, 45 } };
int[] temp = a[1];
a[1] = a[2];
a[2] = temp;
System.out.println(Arrays.deepToString(a));
//輸出 [[1, 9, 5], [10, 34, 45], [7, 2, 4]]
- 還可以方便的構造一個“不規則”的數組,即數組的每一行有不同的長度:
public class LotteryArray {
public static void main(String[] args) {
final int NMAX = 4;
// 分配不規則數組,獨立分配行數組
int[][] odds = new int[NMAX + 1][];
for (int n = 0; n <= NMAX; n++)
odds[n] = new int[n + 1];
// 填充不規則數組
for (int n = 0; n < odds.length; n++)
for (int k = 0; k < odds[n].length; k++) {
for (int i = 1; i <= k; i++)
odds[n][k] = k;
}
// 打印不規則數組
for (int[] row : odds) {
for (int odd : row)
System.out.printf("%4d", odd);
System.out.println();
}
}
}
輸出:
0
0 1
0 1 2
0 1 2 3
0 1 2 3 4