陣列的基本概念和初始化方式
一.陣列的基本概念
· 陣列可以看成是多個相同型別資料組合,對這些資料的統一管理。
· 陣列變數屬引用型別,陣列也可以看成是物件,陣列中的每個元素相當於該物件的成員變數。
· 陣列的元素可以是任何資料型別,包括基本型別和引用型別。
· C和C++中的陣列都可以分配在棧上面,而JAVA中的陣列是隻能分配在堆上面的,因為JAVA中的陣列是引用型別。
二.一維陣列
一維陣列的宣告方式有2種:
· 格式一:陣列元素型別 陣列名[ ]; 即type var[ ];
· 格式二:陣列元素型別[ ] 陣列名; 即type[ ] var;
· 格式二宣告陣列的方法與C#上宣告一維陣列的方法一樣。
例如:int a1[]; int[ ] a2;
double b[ ];
person[ ] p1; String s1[ ];
注意:JAVA語言中宣告陣列時不能指定其長度(陣列中的元素個數)
如:int a[5]; 這樣宣告一維陣列是非法的。
三.陣列的模型
· 一維陣列:一維陣列就是一行,一行小格。
· 二維陣列:二維陣列就是一行加一列組成的一個平面分成的小格,有行有列。
· 三維陣列:三維陣列就是一個立方體。
· 多維陣列實質上是將一個數組當成物件儲存到陣列中。
四.陣列物件的建立
JAVA中使用關鍵字new建立陣列物件時的記憶體分配情況。
格式為:陣列名 = new 陣列元素的型別[陣列元素的個數]
例如:
五.元素為引用資料型別的陣列
注意:元素為引用資料型別的陣列中的每一個元素都需要例項化。
例如:
class Date{
int year; int moth; int day;
Date(int y; int m, int d){
year=y ;
month=m ;
day=d ;
}
}六.陣列的初始化
動態初始化:建立陣列時,由系統預設地為陣列中的元素賦初值,你指定陣列長度
靜態初始化:建立陣列時,程式設計師顯式地為陣列中的元素賦初值,你不指定陣列長度
陣列的隱式初始化:因為陣列是引用型別,它的元素相當於類的成員變數,因此陣列分配空間後,每個元素也被按照成員變數的規則被隱式初始化。
一維陣列
1) int[] a; //宣告,沒有初始化
int a[];
a[0]=1; //錯誤,因為陣列沒有初始化,不能賦值
a[1]=2;
2) int[] a=new int[5]; //初始化為預設值,int型為0(動態)
int[] a;
a=new int[5]; //正確,兩種寫法一樣
3) int[] a={1,2,3,4,5}; //初始化為給定值 (靜態)
int[] a;
a={1,2,3,4,5}; //錯誤,陣列常量只能在初始化操作中使用,如上
4) int[] a=new int[]{1,2,3,4,5}; //同(3) (靜態)
int[] a=newint[5]{1,2,3,4,5}; //錯誤,如果提供了陣列初始化操作,則不能定義維表示式
二維陣列
1) int[][] a; //宣告,沒有初始化
2) int[][] a=new int[2][3]; //初始化為預設值,int型為0
3) int[][] a={{1,2},{2,3},{3,4}}; //初始化為給定值
int[][] a={{1,2},{2,3},{3,4,5}}; //沒有錯,陣列空間不是連續分配的,所以不要求每一維的大小相同
4) int[][] a=new int[2][];
a[0]=new int[3]; //a[0]其實就是一個數組
a[1]=new int[4]; //每一維的大小可以不一樣;
5) int[][] a=new int[][]{{1,2},{2,3},{3,4,5}}; //同(3)
int[] a=new int[5]{{1,2},{2,3},{3,4,5}}; //錯誤,如果提供了陣列初始化操作,則不能定義維表示式
int[][] a=newint[2][];
a[0]={1,2,3,4,5}; //錯誤,陣列常量只能在初始化操作中使用
6) int[][] a=new int[2][];
a[0][1]=1; //錯誤,第二維沒有初始化,不能賦值,java.lang.NullPointerException異常
總結: 1、陣列在使用前(賦值,訪問)必須初始化,可以用new預設初始化,也可以用陣列常量初始化;
2、二維就是陣列的陣列,裡面的陣列大小不要求一樣
· 1.動態初始化
陣列定義與為陣列元素分配空間和賦值的操作分開進行。
例如:
1 public class Test{
2 public static void main(String args[ ]){
3 int a[ ]; //定義陣列,即宣告一個int型別的陣列a[ ]
4 a=newint[3]; //給陣列元素分配記憶體空間。
5 a[0]=3; a[1]=9; a[2]=8; //給陣列元素賦值。
6 Date days[ ];
7 days=new Date[3];
8 days[0]=new Date(1, 4, 2004);
9 days[1]=new Date(2, 4, 2004);
10 days[2]=newDate(3, 4, 2004);
11 }
12 }
13
14 class Date{
15 intyear, month, day;
16 Date(int y,int m,int d){
17 year = y ;
18 month = m ;
19 day = d ;
20 }
21 }
22
· 2.靜態初始化
在定義陣列的同時就為陣列元素分配空間並賦值。
例如:
puclic classTest{
public static voidmain(String args[ ]){
int a[ ] = { 3, 9, 8}; //在定義陣列的同時給陣列分配空間並賦值。
Date days[ ] = {
new Date(1, 4, 2004),
new Date(2 ,4 ,2004),
new Date(3 ,4, 2004)
};
}
}
class Date{
int year, month, day;
Date(int y, int m, intd){
year = y ;
month = m ;
day = d ;
}
}
七.陣列元素的預設初始化
· 陣列是引用型別,它的元素相當於類的成員變數,因此給陣列分配記憶體空間後,每個元素也被按照成員變數的規則被隱式初始化。
1 public class Test{
2 public static void main(String args[ ]){
3 int a[ ] = new int[5];
4 Date[ ] days=new Date[3];
5 System.out.println(a[3]);
6 System.out.println(days[2]);
7 }
8 }
9 class Date{
10 intyear, month, day;
11 Date(int y,int m,int d){
12 year = y ;
13 month = m ;
14 day = d ;
15 }
16 }
輸出結果:
System.out.println(a[3]); 打印出來的結果是:0。
System.out.println(days[2]); 打印出來的結果是:null(空)
在陣列的初始化時,儲存的資料型別是基本資料型別時,其預設值為基本資料型別初始化時的預設值。如,整型的預設值為0;
boolean型的預設值為false等。而引用資料型別的預設值為null。而陣列也屬於引用資料型別。所以b中的陣列中存放的是一個數組而一維陣列是一個引用資料型別,預設初始化的值是null。
int [][]b = new int[3][];
b = {null, null, null};
八.陣列元素的引用
定義並用運算子new為之分配記憶體空間後,才可以引用陣列中的每個元素,陣列元素的引用方式為:arrayName[index], index為陣列元素下標,可以是整型常量或整型表示式。如:a[3], b[i],c[6*i]。
陣列元素下標從0開始;長度為n的陣列的合法下標取值範圍為0 ~ n—1。
每個陣列都有一個屬性length指明它的長度,例如:a.length的值為陣列a的長度(元素個數)。
九.二維陣列