JavaSE學習筆記之-----數組

一、與C語言數組的區別

    Java的數組和C語言還是很大區別的,我認爲兩點區別最大:

    1、首先Java的數組都是引用,用C語言的角度來講就是數組全是指針,舉個例子,一維數組:

int[] a = new int[3];
a[0] = 1;
a[1] = 2;
a[2] = 3;

數組經歷三個步驟,聲明、分配空間、賦值。第一行代碼是將聲明和分配空間放在一條語句,等同於:

int[] a;//聲明
a = new int[3];//分配空間

a是在棧空間上生成的變量,它是一個引用類型,指向堆空間上的3個元素,而這三個元素並不直接保存數組的值,保存的同樣是引用,是指向各自數值(實際的1、2、3數值保存在堆空間的另一塊地方)的引用,畫圖表示:


可以看到,a指向數new出來的數組,當代碼只聲明不賦值的時候數組裏面保存的就是NULL,不指向任何東西,當賦值以後,指向具體的數值,由此可見,數組裏面存放的是引用而不是數值本身。

    注意:在聲明數組的時候是不能指明長度的,例如:

int a[5];

這是非法的。

    2、二維數組的區別

Java的二維數組很好理解,就是以數組爲元素的數組,就是每一個一維數組的元素都是另一個一維數組,如下:

int A[][] = {{1,2},{2,3},{3,4,5}};
int B[3][2] = {{1,2},{2,3},{3,5}};//非法,聲明的時候不能指明長度
int C[][];
C = new int[3][];
C[0] = new int[2];
C[1] = new int[3];
C[2] = new int[2];
//賦值省略

內存圖是:


數組裏面全都是存的引用


二、例程

public class arg {
	public static void main(String args[]) {
		int a[] = new int[args.length];
		for(int i=0;i<args.length;i++) {
			a[i] = Integer.parseInt(args[i]);//查api文檔,把字符串轉成整型
		}
		print(a);	
		select(a);
		print(a);				
	}
	
	private static void select(int a[]) {
		int temp = 0;
		for(int i=0;i<a.length;i++) {
			for(int j=i+1;j<a.length;j++) {
				if(a[i]>a[j]) {
					temp = a[i];
					a[i] = a[j];
					a[j] = temp;
				}
			}
		}
	}
	private static void print(int a[]) {
			for(int i=0;i<a.length;i++) {
				System.out.print(a[i]+" ");
			}
			System.out.println();
	}
}


這個例子是排序,使用了選擇排序的算法,當然還不是最優的,有幾處可以改進的地方。

二維數組的例子;

public class dou {
	public static void main(String[] args) {
		String[][] s;
		s = new String[3][];
		s[0] = new String[2];
		s[1] = new String[3];
		s[2] = new String[2];
		for(int i=0;i<s.length;i++) {
			for(int j=0;j<s[i].length;j++) {
				s[i][j] = new String("我的位置"+i+","+j); 
			}
		}
		
		for(int i=0;i<s.length;i++) {
			for(int j=0;j<s[i].length;j++) {
				System.out.println(s[i][j]);
			}
		}
	}
}


功能就是顯示現在元素的位置,Java的二維數組和C不一樣,不一定得是幾行幾列,Java的二維數組,每一個一維的元素都是一個一維的數組,這樣理解就好了。

三、數組的拷貝

    1、使用java.lang.System類的靜態方法

一維數組的拷貝:

String[] s = 
            {"Mircosoft","IBM","Sun","Oracle","Apple"};
    String[] sBak = new String[6];
    System.arraycopy(s,0,sBak,0,s.length);

二維數組的拷貝:

int[][] intArray = {{1,2},{1,2,3},{3,4}};
    int[][] intArrayBak = new int[3][];
    System.arraycopy
            (intArray,0,intArrayBak,0,intArray.length);

方法名:System.arraycopy

參數:

    第1個參數:從哪個數組拷貝; 第2個參數:從第幾個元素開始拷貝; 第3個參數:往哪裏拷貝;

    第4個參數:對於要拷貝進去的數組,從哪裏元素開始寫入; 第5個參數:拷貝多長。


發佈了44 篇原創文章 · 獲贊 36 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章