1. 程式人生 > >一維陣列建立的幾種方法

一維陣列建立的幾種方法

陣列可以說是對於每種語言學習中的最基礎的資料結構之一,幾乎是在所有專案中都會涉及到陣列的使用,接下來就詳細介紹一下陣列的宣告、建立和初始化以及例項程式碼解析,以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]的值。

總結

以上就是詳細的學習了陣列的一些相關操作,但是這只是為了掌握資料的底層一些設計,在實際工作中,不管動態還是靜態的方法一般都不會用到,因為陣列有一個最大的缺點就是陣列的長度不能改變,實際過程中一般都是通過傳值或者別的方式進行動態的生成陣列,而不是提前指定陣列的大小。