源代码版本为 .NET Framework 4.6.1
本系列持续更新,敬请关注
有投入,有产出。
数组是C#中最基础的一种数据类型,一旦初始化之后,容量便已经确定。若想要动态扩充容量,那么集合可以满足这点需求。ArrayList是C#最常用也是最基础的一个动态数组。
ArrayList在System.Collections中,实现了IList接口(IList:表示可按照索引进行访问的非泛型集合对象)。
如此来,ArrayList可以干点什么事情呢?
1. 可以动态扩容;
2. 插入/删除 比较便捷;
为了防止废话过多而导致翻船,上代码:
- ArrayList中的数据是由一个内部数组来进行维护的,一个私有的Object数据(Object 你就是万能的造物主啊~)
private Object[] _item[];
private int _size;//ArrayList的容量
private const int _defaultCapacity = 4;//默认的容量
private static readonly Object[] emptyArray = EmptyArray<Object>.Value; //默认的空数组
- 添加元素:Add(Object) ,AddRange(ICollection),Insert(Int32, Object),InsertRange(Int32, ICollection)。
- Add(Object):将对象添加到 ArrayList 的结尾处。
public virtual int Add(Object value) {
Contract.Ensures(Contract.Result<int>() >= 0);//后置契约,返回值必须大于等于0
//动态扩容的核心方法,当ArrayList的容量等于内部存放数据的数组长度时,进行扩容
if (_size == _items.Length) EnsureCapacity(_size + 1);
_items[_size] = value;//在ArrayList末尾索引处写入值
_version++;
return _size++;//返回数组ArrayList的容量
}
//动态扩容的核心方法,一次扩容长度为初始容量的2倍,容量不得超出long的最大范围
private void EnsureCapacity(int min) {
if (_items.Length < min) {
int newCapacity = _items.Length == 0
? _defaultCapacity: _items.Length * 2;
//Array.MaxArrayLength为long的最大值
if ((uint)newCapacity > Array.MaxArrayLength)
newCapacity = Array.MaxArrayLength;
if (newCapacity < min) newCapacity = min;
Capacity = newCapacity;
}
}
//自动扩容的实现原理是 创建一个更大容量新的组数,将原数组的数据搬至新组数
public v