HashTable哈希表:
根据关键的key来实现快速寻找寻找value的数据结构。
哈希表会存在一个哈希冲突问题,那就是当你用hash函数作用在两个互不相同的key上,得到的value值相等。这就好比“一个班里面有两个叫做李洋的同学,老师上课的时候叫到李洋起来回答问题,这时就不知道是哪个李洋起来回答问题。”
因此会有避免冲突和解决冲突两种办法。
避免冲突的一个办法就是尽可能的选择合适的哈希函数。
解决方法通常采用开放寻址法,其中包括线性探查,二次探查和二度哈希。
哈希表还有三个常问数值,8,16,0.75.
8是由于哈希表是由数组+红黑树的组合作为底层结构,在长度大于8的时候使用红黑树储存。16是哈希表默认的长度,0.75则是哈希表的加载因子,加载因子这个知识点可以结合动态数组来理解,大致原理就是哈希表生成后,默认长度为16,当它到达16的0.75倍时(即12),要继续加入新数据的话,哈希表会自行动态扩充一倍,变为32。
Dictionary<K,T>字典:
也是工作中常用的存储数据的数据结构,他和哈希表的差别就如同ArrayList和List<T>的区别,它使用强类型来限制Key和Value,创建字典类型时必须指定Key和Value的类型,且字典还采用了不同的冲突解决策略,称为链接技术,哈希表使用的二度哈希,将导致所有哈希重新计算,而链接技术将采用额外的数据结构来处理,字典中的每个位置都映射到了一个链表,当发生冲突时,冲突的元素将被添加到桶列表中。
而字典的缺点就是空间,以空间换时间,通过更多的内存开销来满足对速度的追求。
数据结构总结:
数组部分:Array、ArrayList、List<T>。当元素的数量是固定的,并且需要使用下标时使用。
链表:LinkedList<T>。当元素需要能够在列表两端添加时使用。
队列和栈:Queue<T>、Stack<T>。使用情景为需要实现先进先出时,使用队列。需要实现先进后出时,使用栈。
哈希表和字典:Hashtable、Dictionary<K,T>。使用情景为当需要使用键值对来快速添加和查找,并且元素没有特定的顺序的时候。