C#集合类型大揭秘(5)

SortedSetHashSet,就像SortedDictionary<TKEY,TVALUE>Dictionary<TKEY,TVALUE>一样。SortedSet支持元素按顺序排列,内部实现也是红黑树,并且SortedSet对于红黑树的操作方法和SortedDictionary<TKEY,TVALUE>完全相同。所以不再做过多的分析。

5.Stack

栈是一种后进先出的结构,C#的栈是借助数组实现的,考虑到栈后进先出的特性,使用数组来实现貌似是水到渠成的事。

mark

入栈操作:

mark

弹栈操作:

mark

6.Queue

队列是一种先进先出的结构,C#的队列也是借助数组实现的,有了前面的经验,借助数组实现必然会有数组扩容。C#的队列实现其实是循环队列的方式,可以简单的理解为将队列的头尾相接。至于为什么要这么做?为了节省存储空间和减少元素的移动。因为元素出队列时后面的元素跟着前移是非常消耗性能的,但是不跟着向前移动的话,前面就会一直存在空闲的空间浪费内存。所以使用循环队列来解决这种问题。

mark

入队操作:

mark

mark

出队操作:

mark

线程安全的集合类

需要我们注意的是,上面我们所介绍的集合并不是线程安全的,在多线程环境下,可能会出现线程安全问题。在多线程读的情况下,我们使用普通集合即可。在多线程添加/更新/删除时,我们可以采用手动锁定的方式确保线程安全,但是应该注意加锁的范围和粒度,加锁不当可能会导致程序性能低下甚至产生死锁。

更好的选择的是使用的C#提供的线程安全集合(命名空间:System.Collections.Concurrent)。线程安全集合使用几种算法来最小化线程阻塞。

mark

ConcurrentQueue: 线程安全版本的Queue

ConcurrentStack:线程安全版本的Stack

ConcurrentBag:线程安全的对象集合

ConcurrentDictionary:线程安全的Dictionary

总结

写着写着突然发现跑到数据结构上来了。程序=数据结构+算法。上面提到的集合类型,我们需要在不同的场景进行合适的选择,其实本质上就是选择合适的数据结构。

Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/ffbb9b0749e1e76a7b6d186e7cb0a321.html