ArrayList与List对象用法与区别

比如:

 代码如下 复制代码

string[] s=new string[3];
//赋值
s[0]="a";
s[1]="b";
s[2]="c";
//修改
s[1]="b1";

但是,数组也存在一些不足的地方。比如在数组的两个数据间插入数据也是很麻烦的。还有我们在声明数组的时候,必须同时指明数组的长度,数组的长度过长,会造成内存浪费,数组和长度过短,会造成数据溢出的错误。这样如果在声明数组时我们并不清楚数组的长度,就变的很棘手了。
针对于数组的这些缺点,C#中最先提供了ArrayList对象来克服这些缺点。

ArrayList

ArrayList是.Net Framework提供的用于数据存储和检索的专用类,它是命名空间System.Collections下的一部分。它的大小是按照其中存储的数据来动态扩充与收缩的。所以,我们在声明ArrayList对象时并不需要指定它的长度。
ArrayList继承了IList接口,所以它可以很方便的进行数据的添加,插入和移除.比如:

 代码如下 复制代码

ArrayList list = new ArrayList();

//新增数据
list.Add("abc");
list.Add(123);
//修改数据
list[2] = 345;
//移除数据
list.RemoveAt(0);
//插入数据
list.Insert(0, "hello world");

获取元素值

object value = al[index]; //al 为 ArrayList 对象,一般需要再对 value 进行类型转换,比如:int n = (int)value;
设置元素值

al[index] = value; //al 为 ArrayList 对象,index 必须小于 Count
追加元素

int ArrayList.Add(object value) 返回添加的元素的索引
插入元素

void ArrayList.Insert(int index, object value)
删除元素

删除元素后,后面的元素会前移,但 Capacity 不会变化。

void ArrayList.Remove(object obj) 从前(索引 0)往后查找,删除找到的第一个和 obj 相同的元素
void ArrayList.RemoveAt(int index) 删除索引 index 对应的元素
void ArrayList.RemoveRange(int index, int count) 从索引 index 开始,删除 count 个元素
查找元素

int ArrayList.IndexOf(object value) 从前(索引 0)往后查找,返回找到的第一个和 obj 相同的元素的索引
int ArrayList.IndexOf(object value, int startIndex)
int ArrayList.IndexOf(object value, int startIndex, int count)
int ArrayList.LastIndexOf(object value) 从后往前(索引 0)查找,返回找到的第一个和 obj 相同的元素的索引
int ArrayList.LastIndexOf(object value, int startIndex)
int ArrayList.LastIndexOf(object value, int startIndex, int count)

从上面示例看,ArrayList好像是解决了数组中所有的缺点,那么它应该就是完美的了,为什么在C#2.0后又会出现List呢?
还是从上面的示例看,在list中,我们不仅插入了字符串"abc",而且又插入了数字123。这样在ArrayList中插入不同类型的数据是允许的。因为ArrayList会把所有插入其中的数据都当作为object类型来处理。这样,在我们使用ArrayList中的数据来处理问题的时候,很可能会报类型不匹配的错误,也就是说ArrayList不是类型安全的。既使我们保证在插入数据的时候都很小心,都有插入了同一类型的数据,但在使用的时候,我们也需要将它们转化为对应的原类型来处理。这就存在了装箱与拆箱的操作,会带来很大的性能损耗。

穿插一下装箱与拆箱的概念:

简单的来讲:

装箱:就是将值类型的数据打包到引用类型的实例中
比如将int类型的值123赋给object对象o

 代码如下 复制代码
int i=123;
object o=(object)i;
拆箱:就是从引用数据中提取值类型
比如将object对象o的值赋给int类型的变量i
object o=123;
int i=(int)o;

装箱与拆箱的过程是很损耗性能的。

泛型List
正是因为ArrayList存在不安全类型与装箱拆箱的缺点,所以在C#2.0后出现了泛型的概念。而List类是ArrayList类的泛型等效类。它的大部分用法都与ArrayList相似,因为List类也继承了IList接口。最关键的区别在于,在声明List集合时,我们同时需要为其声明List集合内数据的对象类型。
比如:

 代码如下 复制代码

List<int> list = new List<int>();
//新增数据
list.Add(123);
//修改数据
list[0] = 345;
//移除数据
list.RemoveAt(0);

上例中,如果我们往List集合中插入string字符"hello world",IDE就会报错,且不能通过编译。这样就避免了前面讲的类型安全问题与装箱拆箱的性能问题了。

 代码如下 复制代码

Console.WriteLine("List Test:");
//声明一个整型的List
List<int> lsTest = new List<int>();
lsTest.Add(7);
lsTest.Add(5);
lsTest.Add(1);
lsTest.Add(3);
string strTest="";
//list的排序
lsTest.Sort();
//list的遍历
foreach(int i in lsTest)
strTest+=i.ToString()+" ";
//格式化后输出
Console.Write(string.Format("Out:{0} nCount:{1}n",strTest,lsTest.Count));
//读取下一个按键,以便让屏幕显示数据
Console.ReadKey();

出结果如下

程序代码

List Test:
Out:1 3 5 7
Count:4

时间: 2024-09-19 01:55:33

ArrayList与List对象用法与区别的相关文章

js中innerHTML与innerText的用法与区别

s中innerHTML与innerText的用法与区别 用法: Java代码   <div id="test">      <span style="color:red">test1</span> test2   </div>   在JS中可以使用: Java代码   test.innerHTML:   也就是从对象的起始位置到终止位置的全部内容,包括Html标签. 上例中的test.innerHTML的值也就是&qu

PHP基础温习之echo print printf sprintf print_r var_dump的用法与区别

原文:PHP基础温习之echo print printf sprintf print_r var_dump的用法与区别 一.echoecho() 实际上不是一个函数,是php语句,因此您无需对其使用括号.不过,如果您希望向 echo() 传递一个以上的参数,那么使用括号会发生解析错误.而且echo是返回void的,并不返回值,所以不能使用它来赋值.例子: 复制代码代码如下: <?php $a = echo("55nav"); // 错误!不能用来赋值 echo "55n

php中静态类与静态变量用法的区别分析_php技巧

本文实例分析了php中静态类与静态变量用法的区别.分享给大家供大家参考.具体分析如下: static是定义一个静态对象或静态变量,关于static 定义的变量或类方法有什么特性我们看完本文章的相关实例后就见分晓了. 1. 创建对象$object = new Class(),然后使用"->"调用:$object->attribute/function,前提是该变量/方法可访问. 2. 直接调用类方法/变量:class::attribute/function,无论是静态/非静态

ASP.NET中Application全局对象用法实例浅析

 本文实例讲述了ASP.NET中Application全局对象用法.分享给大家供大家参考.具体如下: Application是应用全局对象,被全体共享.无论通过哪个页面操作Application,另一个页面都可以读取Application信息. 由于Application是共享的,操作之前先Lock,操作完成后UnLock. 在一个页面设置数据: 1 2 3 Application.Lock(); Application.Set("address", "上海");

javascript中clipboardData对象用法

  本文实例讲述了javascript中clipboardData对象用法.分享给大家供大家参考.具体分析如下: clipboardData对象 ,注意网页里剪贴板到现在只能设置Text类型,即只能复制文本 clearData("Text")清空粘贴板 getData("Text")读取粘贴板的值 setData("Text",val)设置粘贴板的值 当复制的时候body的oncopy事件被触发,直接return false就是禁止复制,注意是不

jQuery中delegate与on的用法与区别

 jQuery1.7中 .delegate()已被.on()取代,下面以示例的方式为大家介绍下jQuery中delegate与on的用法与区别,感兴趣的朋友可以参考下 在jQuery1.7中 .delegate()已被.on()取代.对于早期版本,它仍然使用事件委托的最有效手段.  在事件绑定和委派,delegate()和on在一般情况下,这两种方法是等效的.    .delegate() 指定的元素(属于被选元素的子元素)添加一个或多个事件处理程序,并规定当这些事件发生时运行的函数.  代码如

jQuery中delegate和on的用法与区别详细解析

 本篇文章主要是对jQuery中delegate和on的用法与区别进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助 在jQuery1.7中 .delegate()已被.on()取代.对于早期版本,它仍然使用事件委托的最有效手段. 在事件绑定和委派,delegate()和on在一般情况下,这两种方法是等效的.   .delegate() 指定的元素(属于被选元素的子元素)添加一个或多个事件处理程序,并规定当这些事件发生时运行的函数.    代码如下: // jQuery 1.4.3+

java-哪位大神能具体讲一下冒泡法和选择排序的用法,区别?

问题描述 哪位大神能具体讲一下冒泡法和选择排序的用法,区别? 哪位大神能具体讲一下冒泡法和选择排序的用法,区别? 解决方案 冒泡排序就是把小的元素往前调或者把大的元素往后调.比较是相邻的两个元素比较,交换也发生在这两个元素之间.所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的:如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法. #include <stdio.h> #defin

C#中Mutex对象用法分析_C#教程

本文实例讲述了C#中Mutex对象用法.分享给大家供大家参考,具体如下: C#语言有很多值得学习的地方,这里我们就来介绍C# Mutex对象,包括介绍控制好多个线程相互之间的联系等方面. 如何控制好多个线程相互之间的联系,不产生冲突和重复,这需要用到互斥对象,即:System.Threading 命名空间中的 Mutex 类. 我们可以把Mutex看作一个出租车,乘客看作线程.乘客首先等车,然后上车,最后下车.当一个乘客在车上时,其他乘客就只有等他下车以后才可以上车.而线程与C# Mutex对象