ArrayList和(List,LinkedList,數組) 以及 Hastable和Dictionary 的區別 以及 拆裝箱

ArrayList和LinkedList的區別:(單個元素)

1、ArrayList是實現了基於動態數組的數據結構,LinkedList是基於鏈表的數據結構。

2.、對於隨機訪問get(查詢)和set(修改),ArrayList是優於LinkedList,因爲LinkedList要移動指針。

 3. 對於新增和刪除操作add(添加)和remove(刪除),LinekList比較佔優勢,因爲ArrayList要移動數據 

  

ArrayList和List的區別:

ArrayList添加成員過程中中會發生拆裝箱操作,可以插入類型不同的值,因爲他的傳參是object類型的,當我們獲取不當時,會報類型不匹配這樣的錯誤!

List在給它添加成員的時候不會發生拆裝箱,只能插入類型相同的值,可以確保類型安全

ArrayList arrayList=new ArrayList();

arrayList.Add(1); //發生裝箱操作

List<int> list=new list<int>();

list.Add(1); //未發生裝箱操作

 

數組的優缺點:

int[] ints=new int[2];
ints[0]=2
ints[1]=3

優點:索引速度非常快,而且賦值與修改元素也很簡單,直接根據索引找到對象來進行操作即可!

缺點:在數組的兩個數據間插入數據是很麻煩的,而且在聲明數組的時候必須指定數組的長度,數組的長度過長,會造成內存浪費,

        過段會造成數據溢出的錯誤。如果在聲明數組時我們不清楚數組的長度,就會變得很麻煩。

針對數組的這些缺點,C#中最先提供了ArrayList和List對象來克服這些缺點。如上。 

 

拆裝箱:

值類型:原類型(Sbyte、Byte、Short、Ushort、Int、Uint、Long、Ulong、Char、Float、Double、Bool、Decimal)、枚舉(enum)、結構(struct)等,是在棧中分配內存,在申明的同時就初始化,以確保數據不爲NULL;

引用類型:類、數組、接口、委託、字符串等,在堆中分配內存,初始化爲null,引用型是需要GARBAGE COLLECTION來回收內存的,值型不用,超出了作用範圍,系統就會自動釋放;

裝箱:將值類型轉換爲引用類型,用於在垃圾回收堆中存儲值類型,是值類型到 object 類型或到此值類型所實現的任何接口類型的隱式轉換;

拆箱:將引用類型轉換爲值類型,從 object 類型到值類型或從接口類型到實現該接口的值類型的顯式轉換;

利用裝箱和拆箱功能,可通過允許值類型的任何值與Object類型的值相互轉換,將值類型與引用類型鏈接起來

簡例:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BoxExample : MonoBehaviour {

    int val = 100; 
    // Use this for initialization
    void Start () {
        object obj = val;
        Debug.Log("裝箱過程(將值類型轉換爲引用類型的過程):" + obj);
        int num=(int )obj;
        Debug.Log("拆箱過程(將值類型轉換爲引用類型,再由引用類型轉換爲值類型的過程):" + num);
     //判斷拆箱後的類型
      if (obj is Vector3)
        {
            Debug.Log((Vector3 )obj );
        }
        else if (obj is int )
        {
            Debug.Log((int )obj);
        }
    }
}
 

Hashtable和Dictionary的區別:(鍵值對)

1:單線程程序中推薦使用 Dictionary, 有泛型優勢, 且讀取速度較快, 容量利用更充分.
2:多線程程序中推薦使用 Hashtable, 默認的 Hashtable 允許單線程寫入, 多線程讀取, 對 Hashtable 進一步調用 Synchronized() 方法可以獲得完全線程安全的類型. 而 Dictionary 非線程安全, 必須人爲使用 lock 語句進行保護, 效率大減.
3:Dictionary 有按插入順序排列數據的特性 (注: 但當調用 Remove() 刪除過節點後順序被打亂), 因此在需要體現順序的情境中使用 Dictionary 能獲得一定方便.
對於值類型,特定類型(不包括 Object)的 Dictionary<(Of <(TKey, TValue>)>) 的性能優於 Hashtable,這是因爲 Hashtable 的元素屬於 Object 類型,所以在存儲或檢索值類型時通常發生裝箱和取消裝箱操作。


用Dictionary可以避免進行裝箱拆箱操作


線程安全性:

Dictionary
只要不修改該集合,Dictionary<TKey, TValue> 就可以同時支持多個閱讀器。 即便如此,從頭到尾對一個集合進行枚舉本質上並不是一個線程安全的過程。 當出現枚舉與寫訪問互相爭用這種極少發生的情況時,必須在整個枚舉過程中鎖定集合。 若要允許多個線程訪問集合以進行讀寫操作,則必須實現自己的同步。 
有關線程安全另類的信息,請參見 ConcurrentDictionary<TKey, TValue>。 
此類型的公共靜態(在 Visual Basic 中爲 Shared)成員是線程安全的。

HashTable
Hashtable 是線程安全的,可由多個讀取器線程和一個寫入線程使用。 多線程使用時,如果只有一個線程執行寫入(更新)操作,則它是線程安全的,從而允許進行無鎖定的讀取(若編寫器序列化爲 Hashtable)。 若要支持多個編寫器,如果沒有任何線程在讀取 Hashtable 對象,則對 Hashtable 的所有操作都必須通過 Synchronized 方法返回的包裝完成。 
從頭到尾對一個集合進行枚舉本質上並不是一個線程安全的過程。 即使一個集合已進行同步,其他線程仍可以修改該集合,這將導致枚舉數引發異常。 若要在枚舉過程中保證線程安全,可以在整個枚舉過程中鎖定集合,或者捕捉由於其他線程進行的更改而引發的異常。


1.Dictionary<K,V>是以Hash技術爲基礎構建的。在理想情況下,查找時間複雜度爲O(1)
2.從項目實踐上看,Dictionary在初始是以插入順序排的。但MSDN上沒有保證過這一點。
3.Hashtable是明確不按插入順序來排的。

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