一維數組
1.1 數組的聲明和建立
// 兩種先聲明
int[] list1;
int list2[];
//兩種建立
list1 = new int[3];
list2 = new int[] {1,2,3};
// 兩種聲明同時建立
int[] list3 = new int[3];
int list4[] = new int[3];
// 四種聲明建立和指派
int[] list5 = new int[] {1,2,3};
int[] list6 = {1,2,3};
int list7[] = new int[] {1,2,3};
int list8[] = {1,2,3};
//以下符值方法錯誤
//int[] list5 = new int[3]{1,2,3}
//int list7[] = new int[3] {1,2,3};
//給定數組初始值時不能指定大小
1.2 數組的取值和指派
除了前文的聲明的時候指派,還可以在聲明建立之後指派
int list1[]=new int[5]; //預設情況下數組内容都為零
for(int i=0; i<list1.length; i++) {
list1[i]=i;
}
數組的周遊
//兩種周遊方法
for(int i=0;i<list1.length;i++){
System.out.println("list["+i+"]="+list1[i]);
}
for(int i:list1) {
System.out.println("list["+i+"]="+list1[i]);
}
輸出:
方法一:
list[0]=0
list[1]=1
list[2]=2
list[3]=3
list[4]=4
方法二:
list[0]=0
list[1]=1
list[2]=2
list[3]=3
list[4]=4
位址指派,改變其中一個數組的一個值,兩個數組都改變
//此處指派是直接将b這個空間的位址指派給a
//是以改變a會改變b
int[] a= new int[3];
int[] b= {1,2,3};
a=b;
a[0]=0;
System.out.println("b[0]="+b[0]);
輸出:
b[0]=0
數組的實質
int a[];
a=new int[3];
int b[]=new int[4];
System.out.println("a="+a);
System.out.println("b="+b);
a=b;
System.out.println("a="+a);
for(int i=0;i<4;i++){
b[i]=i;
}
for(int i:a) {
System.out.println("a["+i+"]="+i);
}
輸出:
a=[I@15db9742
b=[I@6d06d69c
a=[I@6d06d69c
a[0]=0
a[1]=1
a[2]=2
a[3]=3
從這裡可以看出數組變量實際是存儲堆中申請出空間的位址,直接對數組指派時将空間位址給另一個數組變量,就是兩個數組變量操作同一個空間裡面儲存的值。
值指派,改變其中一個數組的值,另一個數組不受影響
int[] a=new int[5];
int[] b= {1,2,3};
System.out.println("a="+a);
System.out.println("b="+b);
for(int i=0;i<b.length&&i<a.length;i++){
a[i]=b[i];
}
System.out.println("a="+a);
a[0]=0;
System.out.println("a[0]="+a[0]);
System.out.println("b[0]="+b[0]);
System.out.println("a[3]="+a[3]);
輸出:
a=[I@15db9742
b=[I@6d06d69c
a=[I@15db9742
a[0]=0
b[0]=1
a[3]=0
此方法不改變數組a的位址
值指派,調用方法實作
int[] a=new int[5];
int[] b= {1,2,3};
System.out.println("a="+a);
System.out.println("b="+b);
a=Arrays.copyOf(b, 2);
System.out.println("a="+a);
a[0]=0;
System.out.println("a[0]="+a[0]);
System.out.println("b[0]="+b[0]);
System.out.println("a[2]="+a[2]);
輸出:
a=[I@15db9742
b=[I@6d06d69c
a=[I@7852e922
a[0]=0
b[0]=1
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
代碼中可以看出Arrays.copy()方法給a變量傳回的值是重新申請空間的位址,且該位址的長度為Arrays.copy()第二個參數的值。
2.二維數組
2.1 二維數組的聲明和建立
// 兩種先聲明
int[][] list1;
int list2[][];
//三種種建立
list1 = new int[3][];
list1 = new int[2][2];
//建立時,二維數組的行一定要指定,列可以指定,可以不指定
list2 = new int[][] {{1,2},{3}};
// 兩種聲明同時建立
int[][] list3 = new int[3][];
int list4[][] = new int[2][2];
// 四種聲明建立和指派
int[][] list5 = new int[][] {{1,2},{3}};
int[][] list6 = {{1},{2,3}};
int list7[][] = new int[][] {{1,2},{3}};
int list8[][] = {{1,2},{3}};
在這裡說明一下
int[][] list3 = new int[3][];
這句代碼
int[][] a=new int[3][];
System.out.println("a="+a);
System.out.println("a[0]="+a[0]);
int[][] b=new int[3][5];
System.out.println("b="+b);
System.out.println("b[0]="+b[0]);
System.out.println("b[0][0]="+b[0][0]);
a[0]=new int[5];
System.out.println("a[0]="+a[0]);
System.out.println("a[0][0]="+a[0][0]);
輸出:
a=[[I@15db9742
a[0]=null
b=[[I@6d06d69c
b[0]=[I@7852e922
b[0][0]=0
a[0]=[I@4e25154f
a[0][0]=0
輸出結果可以看出
int[][] a=new int[3][];
和
int[][] a=new int[3][5];
的差別在于一個隻申請了a這個空間,一個同時申請了a[]這些以為數組的空間。
2.2 二維數組的取值和指派
取值與指派和一維數組類似,其中比較特殊的是可以直接個二維數組的a[]變量賦一維數組的值
int[][] a=new int[3][];
a[0]=new int[2];
a[1]=new int[] {1,2,3};
int[] b= {1,2,3,4,5};
a[2]=b;
for(int[] i:a) {
for(int j:i) {
System.out.print(j+" ");
}
System.out.println();
}
輸出:
0 0
1 2 3
1 2 3 4 5