天天看點

Java中Array與ArrayList的主要差別

1 )精辟闡述:

可以将 ArrayList 想象成一種“ 會自動擴增容量的Array” 。

2 )Array ([] ):最高效;但是其容量固定且無法動态改變;

     ArrayList :  容量可動态增長;但犧牲效率;

3 )建議:

基于效率和類型檢驗,應盡可能使用Array ,無法确定數組大小時才使用ArrayList !

不過當你試着解決更一般化的問題時,Array 的功能就可能過于受限。

4 )Java 中一切皆對象,Array 也是對象。不論你所使用得Array 型别為何,

Array 名稱本身實際上是個reference ,指向heap 之内得某個實際對象。

這個對象可經由“Array 初始化文法” 被自動産生,也可以以new 表達式手動産生。

5 )Array 可做為函數傳回值 ,因為它本身是對象的reference ;

6) 對象數組與基本類型數組在運用上幾乎一模一樣,唯一差别在于,前者持有得是reference ,後者直接持有基本型别之值;

例如:

string [] staff=new string[100];

int [] num=new int[10];

7 )容器所持有的其實是一個個reference 指向Object ,進而才能存儲任意型别。當然這不包括基本型别,因為基本型别并不繼承自任何classes 。

8 )面對Array ,我們可以直接持有基本型别數值的Array (例如:int [] num;), 也可以持有reference (指向對象)的Array ;但是容器類僅能持有reference (指向對象),若要将基本型别置于容器内,需要使用wrapper 類。但是wrapper 類使用起來可能不很容易上手,此外,primitives Array 的效率比起“ 容納基本型别之外覆類(的reference )” 的容器好太多了。

當然,如果你的操作對象是基本型别,而且需要在空間不足時自動擴增容量,Array 便不适合,此時就得使用外覆類的容器了。

9 )某些情況下,容器類即使沒有轉型至原來的型别,仍然可以運作無誤。有一種情況尤其特别:編譯器對String class 提供了一些額外的支援,使它可以平滑運作。

10 )對數組的一些基本操作,像排序、搜尋與比較等是很常見的。是以在Java 中提供了Arrays 類協助這幾個操作:sort(),binarySearch(),equals(),fill(),asList().

不過Arrays 類沒有提供删除方法,而ArrayList 中有remove() 方法,不知道是否是不需要在Array 中做删除等操作的原因(因為此時應該使用連結清單)。

11 )ArrayList 的使用也很簡單:産生ArrayList ,利用add() 将對象置入,利用get(i )配合索引值将它們取出。這一切就和Array 的使用方式完全相同,隻不過少了[] 而已。

2. 參考資料:

1 )效率:

數組擴容是對ArrayList 效率影響比較大的一個因素。

每當執行Add 、AddRange 、Insert 、InsertRange 等添加元素的方法,都會檢查内部數組的容量是否不夠了 ,如果是,它就會以目前容量的兩倍來重新建構一個數組,将舊元素Copy 到新數組中,然後丢棄舊數組,在這個臨界點的擴容操作,應該來說是比較影響效率的。

ArrayList 是Array 的複雜版本

ArrayList 内部封裝了一個Object 類型的數組,從一般的意義來說,它和數組沒有本質的差别,甚至于ArrayList 的許多方法,如Index 、IndexOf 、Contains 、Sort 等都是在内部數組的基礎上直接調用Array 的對應方法。

2 )類型識别:

ArrayList 存入對象時,抛棄類型資訊,所有對象屏蔽為Object ,編譯時不檢查類型,但是運作時會報錯。

ArrayList 與數組的差別主要就是由于動态增容的效率問題了

3 )ArrayList 可以存任何Object ,如String 等。