数据结构 | Add | Delete | Find | GetByIndex |
Array | O(n) | O(n) | O(n) | O(1) |
ArrayList | O(1) | O(n) | O(n) | O(1) |
List<T> | O(1) | O(n) | O(n) | O(1) |
LinkedList<T> | O(1) | O(n) | O(n) | O(n) |
Stack | O(1) | O(1) | - | - |
Queue | O(1) | O(1) | - | - |
HashTable | O(1) | O(1) | O(1) | - |
Dictionary<K,T> | O(1) | O(1) | O(1) | - |
HashSet<T> | O(1) | O(1) | O(1) | - |
SortedSet<T> | O(Logn) | O(Logn) | O(Logn) | - |
Array 数组
数组是最简单的数据结构之一。其具有一下3个特点。
(1)数组存储在连续的内存上。
(2)数组的元素都是相同类型或者类型的衍生类型。因此数组又被认为是同质数据结构。
(3)数组可以直接通过下标访问。array[i]。
一个数组的常规操作主要两种:
(1)分配存储空间。声明一个新的数组:int[] arr = new int[5]。
(2)访问数组中的元素数据。int i = arr[0]。
创建一个新的数组时,将在Mono运行的托管堆中分配一块连续的内存空间来盛放数量为 size ,类型为所声明类型的数组元素。
由于是在连续内存上存储的,所以它的索引速度非常快,访问一个元素的时间是恒定的。也就是说与数组的元素数量无关,而且赋值与修改元素也很简单。
由于是在连续内存上存储的,所以在两个元素之间插入新的元素就变得不方便。而且声明一个新的数组时,必须指定其长度或初始化其元素,就会存在一个潜在的问题。那就是当声明的长度过长时,显然会浪费内存,当声明长度过短时,则面临溢出的风险。
ArrayList 数组
为了解决 Array 创建时必须指定长度,以及只能存放相同类型的缺点而推出的数据结构。
ArrayList 解决了 Array 的一些缺点:
不必在声明 ArrayList 时指定它的长度,这是由于 ArrayList 对象的长度是按照其中存储的数据来动态增长与缩减的。
ArrayList 可以存储不同类型的元素。这是由于 ArrayList 会把它的元素都当作 Obect 来处理。因