Java、C、C++中的陣列的比較

HIT_微笑前進發表於2015-04-12

陣列是一個很常用的資料型別,在不同的語言中它既有相似點又有各個語言所特有的地方,下面是個人對於陣列的一些理解: 

相同點:

1、不管是在C/C++或是Java中,陣列都是相同型別的資料集合,雖然在面嚮物件語言中,由於類之間的繼承的關係,讓一個陣列中可能存有看似不同的資料型別,但是注意本質上它們都是繼承自同一個型別即陣列的型別的(例如:對於一個水果陣列:陣列中的值可能有蘋果、香蕉、葡萄。。。但是它們都是繼承自水果,即本質上還是同一個資料型別);

2、陣列一旦初始化完成,在記憶體中的空間將被固定,陣列長度不可改變,即使將陣列全部清空,其長度還是不變;

3、均可靜態初始化和動態初始化:

靜態初始化:顯式指定陣列元素值,有系統決定陣列長度;e.g.int[] a = {1,2,3} or int [] a = new int[]{1,2,3};

動態初始化:顯式指定陣列元素的個數,有系統為其提供初始值;

4、陣列名代表陣列的地址,但是元素的地址就因不同語言而不同了== 

不同:

在C和C++中,因為有指標的使用,所以對於陣列我們經常將陣列和指標結合起來使用,陣列名代表這陣列的起始地址即第一個陣列元素存放的地址,之後每隔從陣列名的地址後將上資料型別的長度*n就能得到第n個元素的地址,這個的使用很方便,通常能幫助我們計算出陣列資料型別的長度。

如果陣列中存放的是引用,那麼從陣列名開始向上每個元素中存放的就是引用的地址,這些是連續的;

Java中的陣列:

Java中陣列不單單是一個資料的集合,它本質上是一種引用型別,他定義的變數是一個引用變數,引用變數存放於記憶體棧中,值為其引用的物件的在堆記憶體中的地址;在定義後僅表示為一個引用變數,沒有有效的記憶體,所以定義是不能指定陣列的長度,(而C可以,在定義時指定長度,但是如若不初始化其值就不確定),在使用時也是,如果沒有初始化陣列就為其賦值就會引起空指標異常;

還有引用的物件型別既可以是基本資料型別也可以是引用型別,只是引用型別的話,陣列元素的值還是物件的引用,要使用其值還任需要為每個元素new一個物件,否則初始化後他們的值均為null,使用時還是會引起空指標異常,也就是說引用型別的陣列需要兩次初始化,記憶體棧中陣列名指向記憶體堆中的引用型別的元素,而每個元素又指向真正的物件;

Java中的二維陣列:

由上分析,陣列是一種引用型別,所以,二維陣列本質上應該是一個陣列元素的引用指向一維陣列的一維陣列==

type[][] = new type[len][];即為一個型別為type[]的一維陣列,我們初始化了len個一維陣列型別為type[],具體每個type[]還需要後續的初始化

陣列的迴圈:

java中可以用foreach迴圈陣列而不用知道陣列的長度,但是foreach是不能改變陣列元素的值;

陣列名錶示的是該陣列在棧記憶體中的地址,陣列元素的地址是在堆中,不會像C一樣通過陣列名向上即可得到元素的地址==


還有不全的地方希望大家多指教==

相關文章