差别:C/C++中的数组是可以分配在栈上的
格式:type var[]; 或 type[] var;
格式: 数组名 = new 数组元素类型[元素个数]
public class Test { public static void main(String args[]) { int[] s; // 在栈内存中声明数组引用 s = new int[5]; // 在堆内存中创建数组,并对基本类型的元素初始化{0, 0, 0, 0, 0}, s引用指向它 } }
Note:每一个元素(引用数据类型)都需要初始化。
public class Test { public static void main(String[] args) { Date[] days; days = new Date[3]; for (int i=0; i<3; i++) { days[i] = new Date(2004, 4, i+1); } } } class Date { int year; int month; int day; Date(int y, int m, int d) { year =y; month =m; day = d; } }
int[] a; a = new int[3]; a[0] = 3; a[1] = 9; a[2] = 8; Date[] days; days = new Date[3]; day[0] = new Date(1, 4, 2004); day[1] = new Date(2, 4, 2004); day[2] = new Date(3, 4, 2004);
int[] a = {3, 9, 8}; Date[] days = { new Date(1, 4, 2004); new Date(2, 4, 2004); new Date(3, 4, 2004); };
数组是引用类型,它的元素相当于类的成员变量,因此数组分配空间后,每个元素也被按照成员变量的规则被默认初始化
... ... int[] a = new int[5]; Date[] days = new Date[3]; System.out.println(a[3]); System.out.println(days[3]); ... ... /* Output: 0 null */
arrayName[index]
Note: 在用到数组长度的地方都用arrayName.length属性而非长度值;
// 静态初始化 int intA[][] = {{1, 2}, {2, 3}, {3, 4, 5}}; // int intB[3][2] = {{1, 2}, {2, 3}, {4, 5}}; 非法 // 动态初始化 int a[][] = new int[3][5]; int b[][] = new int[3][]; // int t[][] = new int[][4]; 非法 b[0] = new int[2]; b[1] = new int[3]; b[2] = new int[5];
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
Note: 这个函数名里c居然没有大写
将源数组src从第srcPos项元素开始的length项元素拷贝到目标数组dest从destPos项开始的length个位置;
若length超过目标数组边界会抛出 IndexOutOfBoundsException 异常。
更多见API。
String[] s = ("Microsoft", "IBM", "Sun", "Oracle", "Apple"); String[] sBak = new String[6]; System.arraycopy(s, 0, sBak, 0, s.length); for(int i=0; i < sBak.length; i++) { System.out.println(sBak[i]); // sBak[i]和s[i]的值相同,是字符串常量的引用 } // 二维整型数组拷贝 int[][] a = {{1, 2}, {1, 2, 3}, {3, 4}}; int[][] aBak = new int[3][]; System.arraycopy(a, 0, aBak, 0, a.length); a[2][1] = 100; for(int i=0; i<aBak.length; i++) { for(int j=0; j<aBak[i].length; j++) { System.out.println(aBak[i][j]); // 因为aBak[2]拷贝了a[2]的数组引用,所以aBak[2][1]和a[2][1]是同一个变量,已经改成了100 } }