Array和ArrayList的異同點

前言:最近有一場面試,所以就找找.NET的筆試題來看,說起筆試題,最討厭的就是那些數據結構和算法了,在這方面,確實我的短板!還有設計模式也是我想要加強的方面,這些“硬件”是知名互聯網公司進場的入門檻。


#3 在C#2.0中,建議大家儘量使用範型版的ArrayList,即System.Collection.Generics命名空間下的List<T>,
這樣不但保證了類型安全,而且由於沒有了裝箱和拆箱的過程,從而提高了對象處理的效率。

相信數組是大家在編程最常使用的,不論任何語言都存在數組這樣的數據結構,由於C#語言是完全面向對象的,所以在C#中的數組也是對象,
實際上就是Array類的實例,Array類的使用可以說是使用最頻繁的,只是大家在使用時都沒太在意,如在創建數組int[]時實際上就創建了一個Array類對象的實例。
最近我仔細研究了一下C#中的Array及ArrayList類之間的異同,總結了以下幾點:

[Array和ArrayList的區別]

#1. Array類型的變量在聲明的同時必須進行實例化(至少得初始化數組的大小),而ArrayList可以只是先聲明。
如:
 int[] array = new array[3];
 或 int[] array = {1,2,3};
 或 ArrayList myList = new ArrayList();
這些都是合法的,而直接使用 int[] array;是不行的。

#2. Array只能存儲同構的對象,而ArrayList可以存儲異構的對象。
同構的對象是指類型相同的對象,若聲明爲int[]的數組就只能存放整形數據,string[]只能存放字符型數據,但聲明爲object[]的數組除外。
而ArrayList可以存放任何不同類型的數據(因爲它裏面存放的都是被裝箱了的Object型對象,實際上ArrayList內部就是使用"object[] _items;"這樣一個私有字段來封裝對象的)

#3 在CLR託管對中的存放方式
Array是始終是連續存放的,而ArrayList的存放不一定連續。

#4 初始化大小
Array對象的初始化必須只定指定大小,且創建後的數組大小是固定的,
而ArrayList的大小可以動態指定,其大小可以在初始化時指定,也可以不指定,也就是說該對象的空間可以任意增加。

#5 Array不能夠隨意添加和刪除其中的項,而ArrayList可以在任意位置插入和刪除項。


[Array和ArrayList的相似點]

#1 都具有索引(index),即可以通過index來直接獲取和修改任意項。
#2 他們所創建的對象都放在託管堆中。
#3 都能夠對自身進行枚舉(因爲都實現了IEnumerable接口)。


[ArrayList的一些特性]

#1 在研究ArrayList我發現了一個有趣的現象,ArrayList的capacity屬性值會隨ArrayList中的項的實際大小來發生改變,
如下代碼:

public static void Main(string[] args)
        
{
            ArrayList myList 
= new ArrayList(2);
            Console.WriteLine(
"initial capacity:" + myList.Capacity);

            
int size = 2;
            
for (int i = 0; i < size;i++ )
            
{
                myList.Add(i);
            }

            Console.WriteLine(
"current capacity:" + myList.Capacity);
            
            Console.ReadLine();
        }

當size爲2時,輸出結果中的"current capacity"爲2,
當size爲3或4時,"current capacity"爲4,
當size爲5~8時,"current capacity"爲8,
當size爲9~16時,"current capacity"爲16,
...
通過實驗可以得出一個結論,那就是每當ArrayList中的實際存在的對象數(ArrayList.Count)超過了自身的Capacity閥值,那麼該閥值會自動翻倍。
(也可以改變myList生成時的初始值來試試,但結論是一樣的)

#2 通過ArrayList類的TrimToResize()方法可以將ArrayList實例中的空項去除以壓縮體積。
如以下代碼:

public static void Main(string[] args)
        
{
            ArrayList myList 
= new ArrayList(5);

            
for (int i = 0; i < 3; i++)
            
{
                myList.Add(i);
            }

            Console.WriteLine(
"actual capacity:" + myList.Capacity);
            myList.TrimToSize();
            Console.WriteLine(
"compressed capacity:" + myList.Capacity);
            
            Console.ReadLine();
        }

輸出:
actual capacity:5
compressed capacity:3

#3 在C#2.0中,建議大家儘量使用範型版的ArrayList,即System.Collection.Generics命名空間下的List<T>,
這樣不但保證了類型安全,而且由於沒有了裝箱和拆箱的過程,從而提高了對象處理的效率。

 

轉自:http://www.cnblogs.com/agassi001/archive/2006/05/31/413540.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章