ArrayList 类(动态数组)
在介绍ArrayList 类(动态数组)之前,我们先从数组说起,数组是一种高效的但是不太方便的数据存储方式,之所以不方便,是因为固定长度无法修改,且类型单一。于是为了充分利用内存,就有了动态数组的概念。
ArrayList 类(动态数组)是一个最常用的集合类,与数组的操作方法也是最类似的。C#中动态数组的实现就是集合接口IList,ArrayList和List都继承了接口IList,如下图所示:
ArrayList 代表了可被单独索引的对象的有序集合。它基本上可以替代一个数组。相对于数组而言,ArrayList的好处是长度可以任意改变,类型随便,但其坏处是ArrayList之所以对类型没有要求,是因为ArrayList中存储的类型都是object类型,而其他值类型与object类型进行转换的过程就会产生拆箱装箱,拆箱装箱是一笔不可忽视的开销,伴随而来的就是类型的不安全。
而List泛型在声明时就已经限制了存储内容的数据类型,所以不存在跟object类型的转换自然也就没有了装箱和拆箱的操作,并且是类型安全的。所以,在平时的使用中,如果只是为了使用动态数组,那么就不要考虑ArrayList了。
ArrayList的长度问题:与数组不同的是,ArrayList 可以使用索引在指定的位置添加和移除项目,动态数组会自动重新调整它的大小。每次集合中实际包含的元素个数(集合名.Count)超过了可以包含的元素个数(集合名.capcity)的时候,集合就会向内存中申请多开辟一倍的空间,来保证集合的长度一直够用。
同时 ArrayList 也允许在列表中进行动态内存分配、增加、搜索、排序各项。
创建一个ArrayList 类的对象之前首先要引用命名空间using System.Collections; 然后需要使用该类的构造方法,如下表所示。
构造函数 | 作用 |
---|---|
ArrayList() | 创建 ArrayList 的实例,集合的容量是默认初始容量 |
ArrayList(ICollection c) | 创建 ArrayList 的实例,该实例包含从指定实例中复制的元素,并且初始容量与复制的元素个数相同 |
ArrayList(int capacity) | 创建 ArrayList 的实例,并设置其初始容量 |
ArrayList 类中常用的属性和方法如下表所示
属性或方法 | 作用 |
---|---|
int Add(object value) | 向集合中添加 object 类型的元素,返回元素在集合中的下标 |
void AddRange(ICollection c) | 向集合中添加另一个集合 c |
Capacity | 属性,用于获取或设置集合中可以包含的元素个数 |
void Clear() | 从集合中移除所有元素 |
bool Contains(object item) | 判断集合中是否含有 item 元素,若含有该元素则返回 True, 否则返回 False |
void CopyTo(Array array) | 从目标数组 array 的第 0 个位置开始,将整个集合中的元素复制到类型兼容的数组 array 中 |
void CopyTo(Array array,int arraylndex) | 从目标数组 array 的指定索引 arraylndex 处,将整个集合中的元素赋值到类型兼容的数组 array 中 |
void CopyTo(int index,Array array,int arrayIndex,int count) | 从目标数组 array 的指定索引 arrayindex 处,将集合中从指定索引 index 开始的 count 个元素复制到类型兼容的数组 array 中 |
Count | 属性,用于获取集合中实际含有的元素个数 |
int IndexOf(object value) | 返回 value 值在集合中第一次出现的位置 |
int IndexOf(object value,int startIndex) | 返回 value 值在集合的 startindex 位置开始第一次出现的位置 |
int IndexOf(object value,int startIndex,int count) | 返回 value 值在集合的 startindex 位置开始 count 个元素中第一次出现的位置 |
int LastIndexOf(object value) | 返回 value 值在集合中最后一次出现的位置 |
int LastIndexOf(object value,int startIndex) | 返回 value 值在集合的 startindex 位置开始最后一次出现的位置 |
int LastIndexOf(object value,int startIndex,int count) | 搜索指定的 System.Object,并返回ArrayList中到指定索引为止包含指定元素数的这部分元素中最后一个匹配项的从零开始的索引 |
void Insert(int index,object value) | 将元素插入ArrayList的指定索引处。 |
void InsertRange(int index,ICollection c) | 将集合中的元素插入ArrayList的指定索引处。 |
void Remove(object obj) | 从ArrayList中移除特定对象的第一个匹配项。 |
void RemoveAt(int index) | 移除ArrayList的指定索引处的元素。 |
void RemoveRange(int index,int count) | 从ArrayList中移除一定范围的元素。 |
void Reverse() | 将集合中的元素顺序反转 |
void Reverse(int index,int count) | 将集合中从指定位置 index 处的 count 个元素反转 |
void Sort() | 将集合中的元素排序,默认从小到大排序 |
void Sort(IComparer comparer) | 将集合中的元素按照比较器 comparer 的方式排序 |
void Sort(int index,int count,IComparer comparer) | 将集合中的元素从指定位置 index 处的 count 个元素按照比较器 comparer 的方式排序 |
void TrimToSize() | 将集合的大小设置为集合中元素的实际个数 |
下面通过实例来演示 ArrayList 类中属性和方法的使用,代码示例(代码仅供说明演示,请按照实际情况进行调整):
using System; using System.Collections; //引用命名空间 namespace ConsoleApp { class Program { static void Main(string[] args) { ArrayList list = new ArrayList(); //例:添加单个元素 list.Add(123456); //整型 list.Add("张三"); //string类型 list.Add(3.1415926); //浮点类型 list.Add(true); //布尔类型 //等等…… //例:添加集合元素 list.AddRange(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); //数组类型 list.AddRange(list); //ArrayList类型 //等等…… //清除集合所有元素 list.Clear(); //删除单个元素,移除特定对象的第一个匹配项。 list.Remove("张三"); //根据索引去删除元素 list.RemoveAt(0); //删除索引为0的元素 //根据索引去移除一定范围的元素 list.RemoveRange(0,3);//删除索引0-3的元素 //升序排序 list.Sort(); //当排序类型不一致时有可能会引发报错 //反转排序 list.Reverse(); //在指定的位置插入一个元素 list.Insert(2, "我是插入的内容");//在下标为2的位置,插入元素 //在指定的位置插入一个集合 list.InsertRange(6, new string[] { "王五", "李四" }); //在下标为6的位置,插入集合 //判断是否包含指定的元素 bool b = list.Contains("王五"); //我们知道,ArrayList的容量会随着我们的需要自动按照一定规律进行填充,当我们确定不再添加元素时,我们要释放多余的空间,这就用到了Capacity属性和TrimtoSize()方法 //利用Capacity属性可以查看当前集合的容量 //利用TrimToSize()方法可以释放多余的空间 //查看当前容量 int number = list.Capacity; //去除多余的容量 list.TrimToSize(); //打印输出 for (int i = 0; i < list.Count; i++) { Console.WriteLine(list[i]); } Console.ReadKey(); } } }
文章评论