none
VB.NET的Array VS ArrayList RRS feed

  • 問題

  • 其實應該如何決定使用Array還是ArrayList???

    同樣是儲存字串,亦同樣是根據Index去取其Value.

    有點不明白
    2006年9月2日 上午 08:58

解答

  • 您可以參考一下此篇文章

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

    若知道異同.就可以知道你要如何運用了~也可以讓程式的效能好些!

     

    2006年9月2日 下午 01:17
  • 這篇寫的有點問題,因為我可以用

    Dim A() As Integer, 或 A As Integer() 不做初始化

    我可以變更 A 的大小

    我可以用 Dim A() As Object 來做異質資料,甚至存放物件,或多層陣列

    下面摘一些 MSDN Library for Visual Studio 2005 線上手冊的說法:

    ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.cht/cpref2/html/T_System_Collections_ArrayList.htm

    ArrayList 並不保證已經經過排序。進行需要 ArrayList 的作業 (例如 BinarySearch) 之前,一定要先排序 ArrayList

    ArrayList 的容量是 ArrayList 可以保存的項目數。ArrayList 的預設初始容量為 0。隨著元素逐漸加入 ArrayList 內,也會視需要透過重新配置的方式自動增加容量。若要降低容量,可以呼叫 TrimToSize 或明確地設定 Capacity 屬性。

    使用整數索引可以存取這個集合中的元素。這個集合中的索引以零起始。

    ArrayList 接受 Null 參照 (即 Visual Basic 中的 Nothing) 做為有效值,並允許重複的元素

    ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.cht/dv_fxfund/html/a3160652-4883-4bc2-b4ea-45561fb16298.htm

    ArrayList 或 List 物件是一個複雜版本的陣列。ArrayList 類別和 List 泛型類別提供了大部分 System.Collections 類別均能提供,但 Array 類別所不提供的一些功能。例如:

    • Array 的容量是固定的,ArrayListList 的容量卻是按照需要自動擴充的。如果 Capacity 屬性的值變更,記憶體重新配置和元素的複製會自動完成。

    • ArrayListList 提供加入、插入或移除元素範圍的方法。在 Array 中,您一次只可以取得或設定一個元素的值。

    • 經由使用 Synchronized 方法可以很容易地建立 ArrayListList 的同步處理版本。Array 類別則會讓使用者自己實作同步處理。

    • ArrayListList 提供了方法,可以將唯讀和固定大小的包裝函式傳回給集合;但 Array 則否。

    另一方面,Array 提供了某些 ArrayListList 所沒有的彈性。例如:

    • 您可以設定 Array 的下限,但 ArrayListList 的下限永遠為零。

    • Array 可以擁有多個維度 (Dimension),而 ArrayListList 則永遠只有一個維度。

    • 特定型別 (Object 以外) 的 Array 具有比 ArrayList 更佳的效能,因為 ArrayList 的元素型別為 Object,而且儲存或擷取實值型別 (Value Type) 時,通常會產生 Boxing 和 Unboxing 的狀況。然而,List 如果不需要重新配置,亦即如果初始容量是清單大小上限的概數,它便具備了與相同型別的陣列相近的效能。

    大部分情況下,可以使用 ArrayListList 來取代陣列呼叫;它們比較容易使用,並且一般而言,具有與相同型別的陣列相似的效能。

    Array 位於 System 命名空間 (Namespace);ArrayList 位於 System.Collections 命名空間;List 位於 System.Collections.Generic 命名空間。

    ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VSADD.v10.en/dv_vstechart/html/vbtchPerfOpt.htm

    When you have a set of related objects that you handle similarly, you can put them in an array of objects, or you can create a collection with the objects as members. The following considerations can help you choose between these schemes:

    • The common language runtime can optimize the code for an array, while every access into a collection requires one or more method calls. Therefore, arrays are usually preferable when they support all the operations you need to perform.
    • For indexed accesses, arrays are never slower, and are usually faster, than collections.
    • For keyed accesses, you should use a collection. Arrays do not support access using a key field, so you would have to write code to search through the elements of the array for the key.
    • For insertions and deletions, collections are usually preferable. Arrays do not directly support adding and removing elements. If you are inserting or deleting at the end of an array, you must use the ReDim statement, which reduces performance. To insert or delete anywhere else, you must use an ArrayList object instead of a standard array. By contrast, insertions and deletions are straightforward operations in a collection, and they are equally fast regardless of the position of the elements involved.

    ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VSADD.v10.en/dnvs05/html/datastructures20_1.htm

    (這篇有圖文並茂的說明,包含記憶體圖,就不轉貼了)

    如果你對 VB6 還有印象,我覺得可以當成 Variant 陣列跟集合物件的比較。事實上也是,ArrayList 是繼承集合物件,Array 則是傳統陣列。

    不過我覺得線上說明寫的也很奇怪,因為從 .Net 1.0 的陣列模型就是動態陣列,非過去的靜態陣列,所以說是固定大小很奇怪,有些英文的說明會說是要透過 ReDim 才能變動大小,這就比較清楚。

    我的建議:

    • ArrayList 的適合用於你的資料會動態插入某個位置,導致順序需要全部變化。
    • Array 則適合快速存取、只有線性增加大小或減小大小等。
    2006年9月2日 下午 02:28
    版主

所有回覆

  • 您可以參考一下此篇文章

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

    若知道異同.就可以知道你要如何運用了~也可以讓程式的效能好些!

     

    2006年9月2日 下午 01:17
  • 這篇寫的有點問題,因為我可以用

    Dim A() As Integer, 或 A As Integer() 不做初始化

    我可以變更 A 的大小

    我可以用 Dim A() As Object 來做異質資料,甚至存放物件,或多層陣列

    下面摘一些 MSDN Library for Visual Studio 2005 線上手冊的說法:

    ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.cht/cpref2/html/T_System_Collections_ArrayList.htm

    ArrayList 並不保證已經經過排序。進行需要 ArrayList 的作業 (例如 BinarySearch) 之前,一定要先排序 ArrayList

    ArrayList 的容量是 ArrayList 可以保存的項目數。ArrayList 的預設初始容量為 0。隨著元素逐漸加入 ArrayList 內,也會視需要透過重新配置的方式自動增加容量。若要降低容量,可以呼叫 TrimToSize 或明確地設定 Capacity 屬性。

    使用整數索引可以存取這個集合中的元素。這個集合中的索引以零起始。

    ArrayList 接受 Null 參照 (即 Visual Basic 中的 Nothing) 做為有效值,並允許重複的元素

    ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.cht/dv_fxfund/html/a3160652-4883-4bc2-b4ea-45561fb16298.htm

    ArrayList 或 List 物件是一個複雜版本的陣列。ArrayList 類別和 List 泛型類別提供了大部分 System.Collections 類別均能提供,但 Array 類別所不提供的一些功能。例如:

    • Array 的容量是固定的,ArrayListList 的容量卻是按照需要自動擴充的。如果 Capacity 屬性的值變更,記憶體重新配置和元素的複製會自動完成。

    • ArrayListList 提供加入、插入或移除元素範圍的方法。在 Array 中,您一次只可以取得或設定一個元素的值。

    • 經由使用 Synchronized 方法可以很容易地建立 ArrayListList 的同步處理版本。Array 類別則會讓使用者自己實作同步處理。

    • ArrayListList 提供了方法,可以將唯讀和固定大小的包裝函式傳回給集合;但 Array 則否。

    另一方面,Array 提供了某些 ArrayListList 所沒有的彈性。例如:

    • 您可以設定 Array 的下限,但 ArrayListList 的下限永遠為零。

    • Array 可以擁有多個維度 (Dimension),而 ArrayListList 則永遠只有一個維度。

    • 特定型別 (Object 以外) 的 Array 具有比 ArrayList 更佳的效能,因為 ArrayList 的元素型別為 Object,而且儲存或擷取實值型別 (Value Type) 時,通常會產生 Boxing 和 Unboxing 的狀況。然而,List 如果不需要重新配置,亦即如果初始容量是清單大小上限的概數,它便具備了與相同型別的陣列相近的效能。

    大部分情況下,可以使用 ArrayListList 來取代陣列呼叫;它們比較容易使用,並且一般而言,具有與相同型別的陣列相似的效能。

    Array 位於 System 命名空間 (Namespace);ArrayList 位於 System.Collections 命名空間;List 位於 System.Collections.Generic 命名空間。

    ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VSADD.v10.en/dv_vstechart/html/vbtchPerfOpt.htm

    When you have a set of related objects that you handle similarly, you can put them in an array of objects, or you can create a collection with the objects as members. The following considerations can help you choose between these schemes:

    • The common language runtime can optimize the code for an array, while every access into a collection requires one or more method calls. Therefore, arrays are usually preferable when they support all the operations you need to perform.
    • For indexed accesses, arrays are never slower, and are usually faster, than collections.
    • For keyed accesses, you should use a collection. Arrays do not support access using a key field, so you would have to write code to search through the elements of the array for the key.
    • For insertions and deletions, collections are usually preferable. Arrays do not directly support adding and removing elements. If you are inserting or deleting at the end of an array, you must use the ReDim statement, which reduces performance. To insert or delete anywhere else, you must use an ArrayList object instead of a standard array. By contrast, insertions and deletions are straightforward operations in a collection, and they are equally fast regardless of the position of the elements involved.

    ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VSADD.v10.en/dnvs05/html/datastructures20_1.htm

    (這篇有圖文並茂的說明,包含記憶體圖,就不轉貼了)

    如果你對 VB6 還有印象,我覺得可以當成 Variant 陣列跟集合物件的比較。事實上也是,ArrayList 是繼承集合物件,Array 則是傳統陣列。

    不過我覺得線上說明寫的也很奇怪,因為從 .Net 1.0 的陣列模型就是動態陣列,非過去的靜態陣列,所以說是固定大小很奇怪,有些英文的說明會說是要透過 ReDim 才能變動大小,這就比較清楚。

    我的建議:

    • ArrayList 的適合用於你的資料會動態插入某個位置,導致順序需要全部變化。
    • Array 則適合快速存取、只有線性增加大小或減小大小等。
    2006年9月2日 下午 02:28
    版主
  • 感謝詳細的解答!!!
    定要另存新檔作日反後參考之用~

    ps: 另問鏈大是不是學院講師???

    2006年9月2日 下午 03:20
  • 不是,我是 SOHO 族...

    點我的名字裡面有個人網站可以看。

    我是念水的,專長在於流域整體防洪策略、跨流域的水資源管理、台灣這邊的水利法規等。

    2006年9月2日 下午 03:40
    版主