额。。。今天看了半天Ilist<T>和List<T>的区别,然后惊奇的发现使用IList<T>还是List<T>对我的项目来说没有区别。。。
 在C#中,数组、ArrayList都能够存储一组对象,那么三者到底有什么样的区别呢?

数组

数组在C#中最早出现的。在内存中是连续的,所以它的索引速度非常快,而且赋值与修改元素也很简单。
string[] s=new string[2];

//赋值
s[0]="a";
s[1]="b";
//修改
s[1]="a1";
        但是数组存在一些不足的地方。在数组的两个数据间插入数据是非常麻烦的,而且在声明数组的时候必须指定数组的长度,数组的长度过长会造成内存浪费,过短会造成数据溢出。如果在声明数组时我们不清楚数组的长度就会很麻烦。

ArrayList

        针对数组的这些缺点,C#中最先提供了ArrayList对象来解决这些问题。
        ArrayList是命名空间System.Collections下的一部分,在使用该类时必须进行引用,同时继承了IList接口,提供了数据存储和检索。ArrayList对象的大小是按照存储的数据来动态扩充与收缩的。所以在声明ArrayList对象时并不需要指定它的长度。
ArrayList list1 = new ArrayList();

//新增数据
list1.Add("cde");
list1.Add(5678); //修改数据
list[2] = 34; //移除数据
list.RemoveAt(0); //插入数据
list.Insert(0, "qwe");
       从上面的例子看,ArrayList好像解决了数组中所有的缺点,为什么又会有List?
       我们从上面的例子看,在List中,我们不仅插入了字符串cde,而且插入了数字5678。这样在ArrayList中插入不同类型的数据是允许的。因为ArrayList会把插入其中的数据当object类型来处理,在我们使用ArrayList处理数据时,很可能会报类型不匹配的错误,也就是ArrayList不是类型安全的。在存储或检索值类型时通常发生装箱和取消装箱的操作,带来很大的性能损耗。
       装箱与拆箱的概念:
       简单的说:
       装箱:就是将值类型的数据打包到引用类型的实例中
       比如将string类型的值赋值abc赋给object对象obj
String  i=”abc”;
object obj=(object)i;
       拆箱:就是从引用数据中提取值类型
       比如将object对象obj的值赋值给string类型的变量i
object obj=”abc”;
string i=(string)obj;
       装箱与拆箱的操作是非常耗性能的。

泛型List

       因为ArrayList存在不安全类型与装箱拆箱的缺点,所以出现了泛型的概念。List类是ArrayList类的泛型等效类,它的大部分用法都与ArrayList相似,因为List类也继承了IList接口。最关键的区别在于,在声明List集合时,我们同时需要为其声明List集合内的对象类型。
List<string> list = new List<string>();

//新增数据
list.Add(“abc”); //修改数据
list[0] = “def”; //移除数据
list.RemoveAt(0);
上例中如果我们往List集合中插入int数组123,IDE就会报错,且不能通过编译。这样就避免了前面讲的类型安全问题与装箱拆箱的性能问题了。

总结

      数组的容量是固定的,只能一次获取或设置一个元素的值,而ArrayList或List<T>的容量可根据需要自动扩充、修改、删除、或插入数据。
      数组可以具有多个维度,而ArrayhuoList<T>始终只有一个维度。但是,可以轻松的创建数组列表或列表的列表。特定类型(Object除外)的数组的性能优于ArrayList的性能。这事因为ArrayList的元素属于Object类型;所以在存储或检索值类型时通常发生装箱和拆箱的操作。不过,在不需要重新分配时(即最初容量十分接近列表的最大容量),List<T>的性能与同类型的数组十分相近。
      在决定使用List<T>还是使用ArrayList类(两者具有相似的功能)时,记住List<T>类在大多数情况下执行的更好并且是类型安全的。如果对List<T>类的类型T使用引用类型,则两个类的行为是完全相同的。但是,如果对类型T使用值类型,则需要考虑实现和装箱的问题。

C#编程之IList、List和ArrayList的更多相关文章

  1. C#编程之IList<T>、List<T>、ArrayList、IList, ICollection、IEnumerable、IEnumerator、IQueryable 和 IEnumerable的区别

    额...今天看了半天Ilist<T>和List<T>的区别,然后惊奇的发现使用IList<T>还是List<T>对我的项目来说没有区别...  在C#中 ...

  2. 并行编程之PLINQ

    并行编程之PLINQ 并行 LINQ (PLINQ) 是 LINQ 模式的并行实现.PLINQ 的主要用途是通过在多核计算机上以并行方式执行查询委托来加快 LINQ to Objects 查询的执行速 ...

  3. 网络编程之UDP编程

    网络编程之UDP编程 UDP协议是一种不可靠的网络协议,它在通信的2端各建立一个Socket,但是这个Socket之间并没有虚拟链路,这2个Socket只是发送和接受数据的对象,Java提供了Data ...

  4. 网络编程之TCP编程

    网络编程之TCP编程 前面已经介绍过关于TCP协议的东西,这里不做赘述.Java对于基于TCP协议的网络通信提供了良好的封装,Java使用socket对象来代表两端的通信窗口,并通过Socket产生I ...

  5. 并发编程之wait()、notify()

    前面的并发编程之volatile中我们用程序模拟了一个场景:在main方法中开启两个线程,其中一个线程t1往list里循环添加元素,另一个线程t2监听list中的size,当size等于5时,t2线程 ...

  6. 编程之法:面试和算法心得(字符串包含java实现)

    内容全部来自编程之法:面试和算法心得一书,实现是自己写的使用的是java 题目描述 给定两个分别由字母组成的字符串A和字符串B,字符串B的长度比字符串A短.请问,如何最快地判断字符串B中所有字母是否都 ...

  7. Java网络编程之TCP

    Java网络编程之TCP ​ TCP主要需要两个类:Socket和ServerSocket,Socket是客户端连接服务器时创建,参数需要指定服务器的ip和端口,ServerSocket是服务器端创建 ...

  8. 网络编程之socket

    网络编程之socket socket:在网络编程中的一个基本组件,也称套接字. 一个套接字就是socket模块中的socket类的一个实例. 套接字包括两个: 服务器套接字和客户机套接字 套接字的实例 ...

  9. C++混合编程之idlcpp教程Python篇(9)

    上一篇在这 C++混合编程之idlcpp教程Python篇(8) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相比,工程PythonTutorial7中除了四个文件PythonTu ...

随机推荐

  1. hdu4767_Bell_矩阵快速幂+中国剩余定理

    2013长春赛区网络赛的1009题 比赛的时候这道题英勇的挂掉了,原因是写错了一个系数,有时候粗心比脑残更可怕 本题是关于Bell数,关于Bell数的详情请见维基:http://en.wikipedi ...

  2. 【搜索引擎】Solr全文检索近实时查询优化

    设置多个搜索建议查找算法 <searchComponent name="suggest" class="solr.SuggestComponent"> ...

  3. 【JavaScript】彻底明白this在函数中的指向

    一.this,其实可以类比成人 说到this的话,我们在js中主要研究的都是函数中的this,在javascript中,this代表当前行为的执行主体,而context代表的是当前行为执行的的环境(区 ...

  4. spring与springmvc父子容器

    转载地址:http://www.tianshouzhi.com/api/tutorials/spring 1.spring和springmvc父子容器概念介绍 在spring和springmvc进行整 ...

  5. 使用wireshark捕获SSL/TLS包并分析

    原创博客,转载请注出处! TLS运作方式如下图:

  6. MCtalk对话抱抱星英语:从Diss在线英语教学乱象到回归教育本原

    在百度搜索输入“在线英语”四字,清一色的线上英语培训品牌琳琅满目,“免费英语学习”.“外教口语一对一培训”.“四级听力”.“专属外教”,竞争之激烈可见一斑,创业公司绞尽脑汁挖掘细分市场,试图在一片红海 ...

  7. Web安全深度剖析

    Web安全深度剖析 链接:https://pan.baidu.com/s/15NulgWNzQ2JPCdn9q1jE-g 提取码:6y83    Web安全深度剖析>总结了当前流行的高危漏洞的形 ...

  8. python的数据类型之字符串(二)

    字符串常见操作 如有字符串mystr = 'hello xiaose',以下是常见的操作 1.find 检测某个字符串是否包含在 mystr中,如果是返回开始的索引值,否则返回-1 格式:mystr. ...

  9. 常用的URL Scheme

    系统 短信 sms:// app store itms-apps:// 电话 tel:// 备忘录 mobilenotes:// 设置 prefs:root=SETTING E-Mail MESSAG ...

  10. ZooKeeper入门(二) Zookeeper选举

    1 背景 1.1 什么是leader选举 在zookeeper集群中,每个节点都会投票,如果某个节点获得超过半数以上的节点的投票,则该节点就是leader节点了 1.2 zookeeper集群选举le ...