一維陣列建立的幾種方法
陣列可以說是對於每種語言學習中的最基礎的資料結構之一,幾乎是在所有專案中都會涉及到陣列的使用,接下來就詳細介紹一下陣列的宣告、建立和初始化以及例項程式碼解析,以Java語言描述
宣告
資料型別 陣列名稱[]
或
資料型別[] 陣列名稱 //首選的方法
這部分來說倆種宣告方式的效果是相同的,但是推薦首選第一種方法來宣告,因為第一種方法更加直觀,更具有可讀性,可以通過宣告看出是一種引用型別,而不是普通的資料型別
具體整型陣列宣告如下:
宣告int型陣列
int[] arrNum;
int arrNum[];
這裡的命名看個人喜好,不管怎樣要有自己的規範,我個人一般是加字首arr
另外需要注意的是,Java語言中宣告陣列時不能指定其長度,因為陣列是一種引用型變數,也就是說在陣列定義時實質上是定義了一個引用變數(或者說是一個指標),而此時這個引用變數還沒有指向任何有效的記憶體,並且這時候在記憶體中還沒有開闢任何記憶體空間,所以不能指定長度.
錯誤定義
//int[5] arrNum;
//int arrNum[5];
那麼這個時候學過C++的可能會問,為什麼在C++中這樣定義陣列是合法的呢?而且是這樣定義以後就可以使用,Java卻需要建立、初始化以後才可以使用?
因為C和C++中的陣列就是記憶體塊,而Java中出於安全性考慮,定義的陣列是物件,陣列儲存的僅僅是物件的引用,而不是物件本身,Java中物件是在堆中的,因此陣列無論儲存原始型別還是其他物件型別,陣列物件本身是在堆中的。
建立
Java使用new關鍵字建立陣列,如果陣列建立沒有初始化,必須指定陣列的大小
arrNum = new int[5];//正確
arrNum = new int[]{0,1,2,3,4};//正確
//arrNum = new int[];//錯誤,未初始化也未指定陣列的大小
案例一:
public class ArrayDemo {
public static void main(String []args){
int [] arrNum;
int [] arrNum1;
int [] arrNum2 = new int[5];
arrNum = new int[5];
arrNum1 = new int[]{1,2,3,4,5};
System.out .println(arrNum[0]);
System.out.println(arrNum1[0]);
System.out.println(arrNum2[0]);
}
}
可以看到以上這三種方法建立陣列都是正確的
初始化
其實在上面的案例中已經涉及到了陣列的初始化,陣列的初始化分為靜態初始化、動態初始化以及預設初始化
動態初始化就是在建立過程中只是宣告陣列的大小,而由系統為陣列分配值
int [] arrNum;
arrNum = new int[5];
int [] arrNum = new int[5];//簡化方式
靜態初始化 就是由程式設計師顯式的指定每個陣列元素的值
int [] arrNum1;
arrNum1 = new int[]{1,2,3,4,5};
int[] arrNum1 = {1,2,3,4,5};//簡化方式
這裡對於靜態初始化的方式,推薦使用第一種方式,不推薦簡化方式。
堆疊分析
以上陣列建立的方式,其實歸根到底總共是倆種方式:
方式一:
int[] arrNum;
arrNum = new int[5];
對於這種方式,實質上第一句是建立了一個引用物件,可以認為是在棧記憶體中開闢了一個物件,而為這個物件建立了一個空指標,這時候如果沒有第二句,那麼編譯器就會報錯空指向異常,第二句的作用就是在堆記憶體中開闢出大小為5的記憶體空間
方式二:
int[] arrNum = new int[5];
實際上這種方法就是省去了第一步,也可以說是將物件在堆疊中開闢的過程合為了一個過程
引用傳遞
既然前面提到了陣列實際上是一種引用型別,那麼陣列是一定可以發生引用傳遞的,什麼叫引用傳遞?實質就是同一塊堆記憶體空間能夠被不同的棧空間所訪問,那麼陣列的引用傳遞是怎麼實現?
案例二:
public class ArrayDemo {
public static void main(String[] args) {
int[] arrNum;
arrNum = new int[]{1, 2, 3, 4, 5};
int[] temp = arrNum;
temp[0] = 10;
for (int i = 0;i < arrNum.length; i++){
System.out.println(arrNum[i]);
}
}
}
輸出:
10
2
3
4
5
Process finished with exit code 0
這個時候對於語句int[] temp = arrNum;
執行的就是將temp陣列在棧記憶體空間中開開闢的地址指向和data陣列同樣的堆記憶體地址,而這個時候改變temp[0]的值實質上同時改變了arrNum[0]的值。
總結
以上就是詳細的學習了陣列的一些相關操作,但是這只是為了掌握資料的底層一些設計,在實際工作中,不管動態還是靜態的方法一般都不會用到,因為陣列有一個最大的缺點就是陣列的長度不能改變,實際過程中一般都是通過傳值或者別的方式進行動態的生成陣列,而不是提前指定陣列的大小。