天天看點

Java散記 (一) 數組一維數組2.二維數組

一維數組

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