在C#中,集合分为泛型集合和非泛型集合,非泛型集合的接口和类在System.Collections
命名空间中,而泛型集合的接口和类在System.Collections.Generic
命名空间中。
一、ArrayList
ArrayList为动态列表,是一个非泛型的线性列表,可以将需要管理的数据添加到这个列表中,然后进行一系列操作
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class s1: MonoBehaviour {
void Start () {
ArrayList list = new ArrayList();//初始化动态列表对象
list.Add("Jobs"); //向列表中添加字符串数据
list.Add("Linus");
list.Add("Jensen");
print(list[1]); //Linus
print(list.IndexOf("Jobs") //0
print(list.Count); //打印列表的元素个数:3
List.RemoveAt(1);//将Linus移除
print(list.Count);//打印列表的元素个数:2
print(list.Contains("Linus");//判断是否存在元素“Linus”,返回false
list.Clear();//清除列表,清除后列表为空
void Update () {
}
}
ArrayList是一个非泛型的接口,它的每一个元素被定义为object类型,这就也为这我们可以在ArrayList的对象中添加任意类型的数据,因为在C#中,Everything is object。当我们向列表中添加int类型的数据的时候,由于要将int类型转换为object类型,这时候就发生了装箱操作。在上面的代码中,我们添加的是string类型的数据,而string类型本身是引用类型,因此这里虽然没有阿生装箱操作,但由于有类型装换,所以依然会有效率和安全性的问题。因此,不建议大家使用非泛型的集合,应当尽量使用泛型集合来存储数据。
二、List
以上代码还可以使用泛型集合中的List来进行替换:
public class s2_: MonoBehaviour {
void Start () {
List<string> list = new List<string>(); //初始化动态列表对象,规定列表元素类型为string类型
list.Add("Jobs"); //向列表中添加字符串数据
list.Add("Linus");
list.Add("Jensen");
print(list[1]); //Linus
print(list.IndexOf("Jobs") //0
print(list.Count); //打印列表的元素个数:3
List.RemoveAt(1);//将Linus移除
print(list.Count);//打印列表的元素个数:2
print(list.Contains("Linus");//判断是否存在元素“Linus”,返回false
list.Clear();//清除列表,清除后列表为空
void Update () {
}
三、总结:
List和ArrayList在使用昂发和接口上基本上是相同的,只是List是基于泛型的,在初始化的时候就规定了元素的类型,这样在进行添加、打印、判断下表、是否存在等操作时,就避免了类型转换和装箱拆箱的操作,因此提高了安全性和执行效率。