一、與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個參數:拷貝多長。