动态数组(ArrayList)
1.简介
动态数组(ArrayList)代表了可被单独索引的对象的有序集合(从前往后)。
它基本上可以替代一个数组。但是与数组不同的是,您可以使用索引在指定的位置添加和移除项目,动态数组会自动重新调整它的大小。它也允许在列表中进行动态内存分配、增加、搜索、排序各项。
2.特性介绍
1)容量是指动态数组最大包含的元素数,会根据元素增减而动态调整容量。
2)插入和删除元素会改变其它元素下标,当然排序同样会调整下标。
3)所有元素均为 object 类型。
- ArrayList 类的方法和属性
1)ArrayList 类的一些常用的 属性:
| 属性 | 描述 |
|---|---|
| Capacity | 获取或设置集合容量 |
| Count | 获取实际包含的元素个数 |
| IsFixedSize | 是否具有固定大小 |
| IsReadOnly | 是否只读 |
2)ArrayList 类的一些常用的 方法:
| 方法 | 描述 |
|---|---|
| int Add( object value ); | 在末尾添加一个对象 |
| void AddRange( ICollection c ); | 在末尾添加集合的元素 |
| void Clear(); | 移除所有的元素 |
| bool Contains( object item ); | 判断元素是否存在 |
| ArrayList GetRange( int index, int count ); | 返回一个ArrayList,表示从索引位置到指定长度的元素集合 |
| int IndexOf(object); | 返回某个值第一次出现的索引(索引从零开始) |
| void Insert( int index, object value ); | 在指定索引处,插入一个元素 |
| void InsertRange( int index, ICollection c ); | 在指定索引处,插入某个集合的元素 |
| void Remove( object obj ); | 移除第一次出现的指定对象 |
| void RemoveAt( int index ); | 移除指定索引处的元素 |
| void RemoveRange( int index, int count ); | 移除某个范围的元素 |
| void Reverse(); | 逆转元素的顺序 |
| void SetRange( int index, ICollection c ); | 复制某个集合的元素到某个范围的元素上 |
| void Sort(); | 元素进行排序 |
| void TrimToSize(); | 设置容量为元素的实际个数 |
2. 代码演示
注意:为了方便阅读,以下将代码拆分为多段进行演示,实际运行可以把代码直接拼接起来
using System;
using System.Collections;
using System.Collections.Generic;
namespace ArrayListTest
{
class Program
{
static void Main(string[] args)
{
ArrayListTest();
Console.ReadKey();
}
//封装两个简单方法,方便后续验证使用
///
/// 分隔线
///
static void 分隔线()
{
Console.WriteLine("n ------------------------------------------- n");
}
///
/// 遍历 ArrayList 中的所有元素
///
static void FArrayList(ArrayList array)
{
Console.WriteLine("元素:");
foreach (var item in array)
{
Console.WriteLine(item);
}
分隔线();
}
static void ArrayListTest()
{
//不可为泛型,可以指定容量
ArrayList arraylist = new ArrayList();
Console.WriteLine("1.Add()方法可添加任意类型数据:");
arraylist.Add(1);
arraylist.Add('a');
arraylist.Add("A");
arraylist.Add(false);
arraylist.Add(1.111f);
int[] i = {0,1 };
arraylist.Add(i);
Dictionary dic = new Dictionary();
dic.Add(1, "程序");
arraylist.Add(dic);
Console.WriteLine("数组容量:" + arraylist.Capacity);//容量会根据实际元素数量扩容
Console.WriteLine("元素个数:" + arraylist.Count);
Console.WriteLine("长度固定:" + arraylist.IsFixedSize);
Console.WriteLine("是否只读:" + arraylist.IsReadOnly);
Console.WriteLine("默认元素:" );
FArrayList(arraylist);
Console.WriteLine("2.在末尾添加集合元素:" );//添加的集合元素会被遍历出单个进行添加
List li = new List();
li.Add("编程");
li.Add("代码");
arraylist.AddRange(li);
FArrayList(arraylist);
}
}
}
运行结果:
Console.WriteLine("3.判断元素是否存在:");
Console.WriteLine("代码是否存在: " + arraylist.Contains("代码"));
Console.WriteLine("0是否存在: " + arraylist.Contains(0));
Console.WriteLine("n");
Console.WriteLine("4.从指定位置索引获取指定长度集合:");
ArrayList array2 = arraylist.GetRange(2, 3);
FArrayList(array2);
运行结果:
Console.WriteLine("5.获取某个值第一次出现的索引:");
arraylist.Add("A");
Console.WriteLine("A的索引值: " + arraylist.IndexOf("A"));
Console.WriteLine("n");
Console.WriteLine("6.指定索引处插入一个元素: 2, B ");
//插入元素后,后面元素的下标会后移一位
Console.WriteLine(" 前." + arraylist[2]);
arraylist.Insert(2, "B");
Console.WriteLine(" 后." + arraylist[2]);
Console.WriteLine("7.指定索引处插入集合元素:9, dic ");
//插入集合后,将会改变后面所有元素的下标
Console.WriteLine(" 前." + arraylist[9]);
arraylist.InsertRange(9, dic);
Console.WriteLine(" 后." + arraylist[9]);
运行结果:
Console.WriteLine("8.移除第一次出现的指定对象:dic ");
//移除元素后,后面元素的下标会前移一位
int id = arraylist.IndexOf(dic);
Console.WriteLine(" 前." + arraylist[id]);
arraylist.Remove(dic);
Console.WriteLine(" 后." + arraylist[id]);
Console.WriteLine("9.移除指定索引处的元素:{0}",arraylist[2]);
//移除集合后,将会改变后面所有元素的下标
Console.WriteLine(" 前." + arraylist[2]);
arraylist.RemoveAt(2);
Console.WriteLine(" 后." + arraylist[2]);
Console.WriteLine("10.移除指定范围的元素:");
arraylist.RemoveRange(3, 3);//从索引开始,移除3个元素
FArrayList(arraylist);
运行结果:
Console.WriteLine("11.逆转元素的顺序:");
arraylist.Reverse();
FArrayList(arraylist);
运行结果:
Console.WriteLine("12.复制某个集合的元素到某个范围的元素上:");
arraylist.SetRange(0,li);
FArrayList(arraylist);
运行结果:
Console.WriteLine("13.对元素进行排序:");//数据必须为相同类型,否则无法排序
arraylist.Clear();
arraylist.Add("b");
//ar.Add(1);
//ar.Add(3);
arraylist.Add("a");
arraylist.Sort();
FArrayList(arraylist);
运行结果:
补充事项:
关于初始化ArrayList,初始化时可以直接赋值,这里涉及到其它数据类型的转换
static void ArrayListTest2()
{
int[] i = { 1, 2, 3, 4 };//一维数组
int[,] i2 = { { 0, 0 }, { 0, 1 }, { 0, 3 } };//多维数组
Dictionary dic = new Dictionary();//字典
dic.Add(0, "a");
dic.Add(1, "b");
ArrayList ar = new ArrayList( i );
//ArrayList ar2 = new ArrayList( i2 ); //使用多维数组运行会报错,同理,数组型的数组也会报错
ArrayList ar3 = new ArrayList( dic );
foreach (var item in ar)
{
Console.WriteLine(item);
}
Console.WriteLine("n");
foreach (var item in ar3)
{
Console.WriteLine(item);
}
Console.WriteLine("n");
}
运行结果:



