ArrayList是C#中System.Collections命名空间下的一个非泛型集合类,本质上是一个可以动态扩容的数组结构,不需要在初始化时指定固定长度,能够根据存储元素的数量自动调整容量,同时提供了丰富的操作方法,方便开发者对集合内的元素进行增删改查等操作。

ArrayList的核心特性
和普通数组相比,ArrayList有以下几个显著特点:
- 动态扩容:普通数组的长度在初始化后就固定了,无法再添加超出长度的元素,而ArrayList会根据元素数量自动扩展内部数组的容量,不需要开发者手动处理扩容逻辑。
- 存储任意类型元素:普通数组只能存储声明时指定的同一类型元素,ArrayList可以存储object类型的元素,因此任意类型的对象都可以存入其中。
- 提供丰富的内置方法:ArrayList封装了添加、删除、查找、排序等常用操作,不需要开发者自己实现这些逻辑,降低编码复杂度。
ArrayList的常用操作
初始化与添加元素
使用ArrayList前需要先引入System.Collections命名空间,然后通过new关键字创建实例,再调用Add方法添加元素:
using System;
using System.Collections;
class Program
{
static void Main()
{
// 创建ArrayList实例
ArrayList arrayList = new ArrayList();
// 添加不同类型的元素
arrayList.Add(100);
arrayList.Add("测试字符串");
arrayList.Add(DateTime.Now);
// 输出元素数量
Console.WriteLine("当前元素数量:" + arrayList.Count);
}
}
访问与修改元素
ArrayList的元素可以通过索引访问,索引从0开始,修改元素直接对指定索引位置赋值即可:
using System;
using System.Collections;
class Program
{
static void Main()
{
ArrayList arrayList = new ArrayList();
arrayList.Add(10);
arrayList.Add(20);
arrayList.Add(30);
// 访问索引为1的元素
Console.WriteLine("索引1的元素:" + arrayList[1]);
// 修改索引为1的元素
arrayList[1] = 25;
Console.WriteLine("修改后索引1的元素:" + arrayList[1]);
}
}
删除元素
ArrayList提供了多种删除元素的方式,可以根据索引删除,也可以根据元素值删除,还可以清空所有元素:
using System;
using System.Collections;
class Program
{
static void Main()
{
ArrayList arrayList = new ArrayList();
arrayList.Add(1);
arrayList.Add(2);
arrayList.Add(3);
arrayList.Add(4);
// 按索引删除,删除索引为1的元素
arrayList.RemoveAt(1);
// 按值删除,删除元素值为3的元素
arrayList.Remove(3);
// 清空所有元素
// arrayList.Clear();
Console.WriteLine("删除后元素数量:" + arrayList.Count);
}
}
查找与排序
ArrayList内置了Contains方法判断元素是否存在,Sort方法可以对集合内元素进行排序,不过排序要求集合内元素实现了IComparable接口:
using System;
using System.Collections;
class Program
{
static void Main()
{
ArrayList arrayList = new ArrayList();
arrayList.Add(5);
arrayList.Add(1);
arrayList.Add(3);
arrayList.Add(2);
// 判断元素是否存在
bool hasThree = arrayList.Contains(3);
Console.WriteLine("是否存在元素3:" + hasThree);
// 排序
arrayList.Sort();
Console.WriteLine("排序后的元素:");
foreach (var item in arrayList)
{
Console.WriteLine(item);
}
}
}
ArrayList的局限性
虽然ArrayList使用灵活,但在实际开发中并不推荐优先使用,主要有两个核心问题:
- 类型不安全:因为ArrayList存储的是object类型元素,存入值类型元素时会发生装箱操作,取出时需要拆箱,不仅影响性能,还可能在拆箱时因为类型不匹配抛出InvalidCastException异常。
- 性能不如泛型集合:泛型集合List<T>在编译期就会检查元素类型,避免了装箱拆箱操作,同时类型更安全,是ArrayList的替代方案。
使用场景建议
如果是旧项目维护,可能会遇到ArrayList的使用场景,新项目开发时,如果元素类型统一,优先选择List<T>;如果确实需要存储不同类型的元素,再考虑使用ArrayList,同时要注意做好类型判断,避免拆箱时的类型错误。
注意:在代码中使用HTML相关标签名称时,需要按照规范转义,比如提到<input>标签时,要写成转义后的形式,避免被解析为HTML元素。
当需要突出显示代码术语时,可以使用<code>标签,比如<code>Add()</code>方法,这里的<code>标签本身不需要转义,内部内容会正常显示。