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是明確不按插入順序來排的。