zoukankan      html  css  js  c++  java
  • c#中常用集合类和集合接口之集合类系列

    常用集合类:

    数组(Array)的不足(即:集合与数组的区别)

    1. 数组是固定大小的,不能伸缩。虽然System.Array.Resize这个泛型方法可以重置数组大小,但是该方法是重新创建新设置大小的数组,用的是旧数组的元素初始化。随后以前的数组就废弃!而集合却是可变长的。

    2. 数组要声明元素的类型,集合类的元素类型却是object。

    3. 数组可读可写不能声明只读数组。集合类可以提供ReadOnly方法以只读方式使用集合。

    4. 数组要有整数下标才能访问特定的元素,然而很多时候这样的下标并不是很有用。集合也是数据列表却不使用下标访问。很多时候集合有定制的下标类型,对于队列和栈根本就不支持下标访问!

    数组列表(ArrayList)

    ArrayList可以存储任何类型,不像List泛型那样有严格要求,List<T>更有效,ArrayList就相当于是List<object>。

    ArrayList类对象被设计成为一个动态数组类型,其容量会随着需要而适当的扩充方法:

    1:Add()向数组中添加一个元素

    2:Remove()删除数组中的一个元素

    3:RemoveAt(int i)删除数组中索引值为i的元素

    4:Reverse()反转数组的元素

    5:Sort()以从小到大的顺序排列数组的元素

    6:Clone()复制一个数组

    System.Collections命名空间包含接口和类,这些接口和类定义各种对象(如列表、队列、位数组、哈希表和字典)的集合。System.Collections.Generic 命名空间包含定义泛型集合的接口和类,泛型集合允许用户创建强类型集合,它能提供比非泛型强类型集合更好的类型安全性和性能。System.Collections.Specialized 命名空间包含专用的和强类型的集合,例如,链接的列表词典、位向量以及只包含字符串的集合。

    列表(List)

    可通过索引访问的对象的强类型列表。提供用于对列表进行搜索、排序和操作的方法,在决定使用List还是使用ArrayList类(两者具有类似的功能)时,记住List类在大多数情况下执行得更好并且是类型安全的。如果对List类的类型T使用引用类型,则两个类的行为是完全相同的。但是如果对类型T使用值类型,则需要考虑实现和装箱问题。

    如果对类型T使用值类型,则编译器将特别针对该值类型生成List类的实现。这意味着不必对List对象的列表元素进行装箱就可以使用该元素,并且在创建大约500个列表元素之后,不对列表元素装箱所节省的内存将大于生成该类实现所使用的内存。

    哈希表(HashTable)

    一、哈希表(Hashtable)简述

    在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key/value的键值对,其中key通常可用来快速查找,同时key是区分大小写;

    value用于存储对应于key的值。Hashtable中key/value键值对均为object类型,所以Hashtable可以支持任何类型的key/value键值对.

    二、哈希表的简单操作

    在哈希表中添加一个key/value键值对:HashtableObject.Add(key,value);

    在哈希表中去除某个key/value键值对:HashtableObject.Remove(key);

    从哈希表中移除所有元素:HashtableObject.Clear();

    判断哈希表是否包含特定键key:HashtableObject.Contains(key);

    字典(Directonary)

    Hashtable和Dictionary<K, V>类型
     1:单线程中推荐使用Dictionary,有泛型优势,且读取速度较快,容量利用更充分.
     2:多线程中推荐使用Hashtable,默认Hashtable允许单线程写入, 多线程读取对Hashtable进一步调用Synchronized()方法可以获得完全线程安全的类型,而Dictionary非线程安全,必须人为使用lock语句进行保护, 效率大减。
     3:Dictionary有按插入顺序排列数据的特性(注:但当调用Remove()删除过节点后顺序被打乱), 因此在需要体现顺序的情境中使用Dictionary能获得一定方便。

    HashTable应用场合:做对象缓存,树递归算法的替代,和各种需提升效率的场合。HashTable中的key/value均为object类型,由包含集合元素的存储桶组成。存储桶是 HashTable中各元素的虚拟子组,与大多数集合中进行的搜索和检索相比,存储桶可令搜索和检索更为便捷。每一存储桶都与一个哈希代码关联,该哈希代码是使用哈希函数生成的并基于该元素的键。HashTable的优点就在于其索引的方式,速度非常快。如果以任意类型键值访问其中元素会快于其他集合,特别是当数据量特别大的时候,效率差别尤其大。

    排序列表(SortedList)

    与哈希表类似,区别在于SortedList中的Key数组排好序的

    名-值集合(NameValueCollection)

    NameValueCollection与HashTable很类似,但是他们还是有区别的,HashTable 的KEY是唯一性,而NameValueCollection则不唯一

    堆栈(Stack)

    表示对象的简单的后进先出非泛型集合。Push方法入栈,Pop方法出栈

    队列(Queue)

    队列先进先出,enqueue方法入队列,dequeue方法出队列

    常用集合接口系列:http://www.cnblogs.com/fengxiaojiu/p/7997704.html

    常用集合类系列:http://www.cnblogs.com/fengxiaojiu/p/7997541.html


  • 相关阅读:
    分层图最短路(DP思想) BZOJ2662 [BeiJing wc2012]冻结
    动态规划 BZOJ1925 地精部落
    线性DP SPOJ Mobile Service
    线性DP codevs2185 最长公共上升子序列
    数位DP POJ3208 Apocalypse Someday
    线性DP POJ3666 Making the Grade
    杨氏矩阵 线性DP? POJ2279 Mr.Young's Picture Permutations
    tarjan强连通分量 洛谷P1262 间谍网络
    树链剖分 BZOJ3589 动态树
    二分图 BZOJ4554 [Tjoi2016&Heoi2016]游戏
  • 原文地址:https://www.cnblogs.com/hgmyz/p/12352561.html
Copyright © 2011-2022 走看看