<C#高级编程>第9章笔记
原以为应当和Java中的集合框架差不多。。好像并没有Set(之后搜索得到在.NET 3.5中增加了HashSet),而多了个集合的概念。
第9章 集合
除了System.Array之外,其他数据结构都存放在System.Collections命名空间中。
数组列表 < System.Collections.ArrayList >
有足够的存储单元来存储一定量的对象引用,若超过容量则ArrayList的容量会自动扩展为当前容量的两倍,并重新定位这些元素。
默认大小为16,也可以在构造方法中带入参数以创建一个指定容量的ArrayList。
增加元素:Add(obj)
获得元素:[pos]
插入到指定位置:Insert(pos, obj)
删除元素:RemoveAt(pos)、Remove(obj)
* 添加或删除元素都会使后面的元素在内存中作相应的改变
获得容量:Capacity属性——可以直接对其修改,此时会给ArrayList重新分配新的内存块,其容量大小是所要求的大小。
转换为数组:没有相关方法,只能迭代数组列表手工复制引用。
集合
可以通过遍历每个元素来访问的一组对象,特别是可以用foreach循环来访问它们。
集合必须实现接口 System.Collections.IEnumerable,它只有一个GetEnumerator()方法,返回一个IEnumerator对象。
枚举器应当实现IEnumerator接口,重写其中的只读属性Current、构造器、MoveNext()、ReSet()方法。
更复杂的集合接口:派生了IEnumerator接口的ICollection接口,它提供了更多的属性和方法。
字典(映射/散列表)
按照某个键来访问元素
可以自定义字典,通过实现System.Collections.DictionaryBase抽象类;也可以使用Hashtable;
如果键为字符串,可以直接使用System.Collections.Specialized.StringDictionary类。
与ArrayList一样,可以在创建的时候指定原始容量。容量为素数时Hashtable的效率最高。
添加数据项:Add(key, value)
获得数据项:[key]
删除数据项:Remove(key)
获得数据项个数:Count 属性
Hashtable通过对象的Equals()方法判断两个对象是否相等,通过GetHashCode()方法计算散列值。
因此当两个对象的Equals()为true时,GetHashCode()值应当相同。当重写了Equals()方法,就必须重写GetHashCode()方法。
除了ArrayList类和Hashtable类外,还有其他集合对象如SortedList、Queue和Stack类。