一、前言:

  在c#数据结构中,集合的应用非常广泛,无论是做BS架构还是CS架构开发,都离不开集合的使用,比如我们常见的集合包括:Array、ArrayList、List、LinkedList等。这一些数据集合,在功能上都能够实现集合的存取,但是他们内部有什么区别,在使用时需要注意一些什么呢?下面根据个人的经验,对这一些集合数据的使用做一个简单的小结,如果说的不对的地方,欢迎指出,多多交流改进。

二、Array集合简介

  Array集合,也就是数组,是最简单的数据结构,其存储的数据在内存空间是连续的,数组有一下一些特点

  • 1.数据存储是连续的
  • 2.数组长度在定义时就必须制定
  • 3.数组存储的数据类型都是同一类型
  • 4.数组可以直接通过小标访问

  优缺点:
   优点:
  1、可以根据索引直接访问,访问速度快
   2、数据是安全的,由于数据类型一致性,在存储使用过程中不涉及
  缺点:
  1、由于数据是连续存储的,导致插入效率变慢
    2、由于数组长度大小固定,那么对预期非固定长度的数字不好处理

  练习实例代码:

    /// <summary>
/// 数组练习操作
/// </summary>
public class ArrayTest
{
/// 数组 Array 对于大家来说一点都不陌生
/// 数组是在内存连续分配的存储空间,这也导致数组有一下一些特点
/// 1.数据存储是连续的
/// 2.数组长度在定义时就必须制定
/// 3.数组存储的数据类型都是同一类型
/// 4.数组可以直接通过小标访问
///
/// 优缺点:
/// 优点:
/// 1、可以根据索引直接访问,访问速度快
/// 2、数据是安全的,由于数据类型一致性,在存储使用过程中不涉及到装箱拆箱操作
/// 缺点:
/// 1、由于数据是连续存储的,导致插入效率变慢
/// 2、由于数组长度大小固定,那么对预期非固定长度的数字不好处理 /// int类型的数组操作
public static void IntArrayTest()
{ //// 定义一个秒表,执行获取执行时间
Stopwatch st = new Stopwatch();//实例化类
st.Start();//开始计时 Console.WriteLine("开始初始化长度为10000000的int数组:"); //// 定义一个数组
int[] nums = new int[];
for (int i = ; i < ; i++)
{
nums[i] = + ;
} //需要统计时间的代码段 st.Stop();//终止计时
Console.WriteLine(string.Format("初始化长度为10000的int数组完毕!总耗时{0}毫秒", st.ElapsedMilliseconds.ToString()));
}
}

三、ArrayList集合简介

ArrayList 是Array的升级版,能够解决Array的一些缺点
ArrayList其内部实现也是Array,只是其长度是可以动态,在其内部用一个变量记录控制长度,ArrayList有如下一些特点

  • 1.长度不固定
  • 2.可以存储不同的数据类型(object)
  • 3.同样支持索引查询(可以直接通过小标访问)
  • 4.灵活性更强,以牺牲性能为代价

优缺点:
优点:
1、长度不固定,在定义是不必担长度溢出
2、可以存储任意数据类型
3、可根据索引查询,查询效率快
缺点:
1、由于长度不固定,执行效率低下,因为超出默认长度(10)后,会自动扩容拷贝数据,牺牲性能
2、由于存储类型是object,所以在存数据时会有装箱操作,在取数据时会有拆箱操作,影响效率
3、线程不安全,因为其内部实现是用size、array来共同控制,在新增操作时是非原子操作,所以非安全线程

使用技巧:
在实际使用过程中,为了避免自动扩容,可以预估数据长度,初始化一个数据长度,从而提高效率

练习实例代码:

    /// <summary>
/// ArrayList数组练习操作
/// </summary>
public class ArrayListTest
{
/// ArrayList 是Array的升级版,能够解决Array的一些缺点
/// ArrayList其内部实现也是Array,只是其长度是可以动态,在其内部用一个变量记录控制长度,ArrayList有如下一些特点
/// 1.长度不固定
/// 2.可以存储不同的数据类型(object)
/// 3.同样支持索引查询(可以直接通过小标访问)
/// 4.灵活性更强,以牺牲性能为代价 /// 优缺点:
/// 优点:
/// 1、长度不固定,在定义是不必担长度溢出
/// 2、可以存储任意数据类型
/// 3、可根据索引查询,查询效率快
/// 缺点:
/// 1、由于长度不固定,执行效率低下,因为超出默认长度(10)后,会自动扩容拷贝数据,牺牲性能
/// 2、由于存储类型是object,所以在存数据时会有装箱操作,在取数据时会有拆箱操作,影响效率
/// 3、线程不安全,因为其内部实现是用size、array来共同控制,在新增操作时是非原子操作,所以非安全线程
///
/// 使用技巧:
/// 在实际使用过程中,为了避免自动扩容,可以预估数据长度,初始化一个数据长度,从而提高效率 /// ArrayList操作实例
public static void ArrayListOpert()
{ //// 定义一个秒表,执行获取执行时间
Stopwatch st = new Stopwatch();//实例化类 //// 需要统计时间的代码段(统计初始化长度时的执行时间)
st.Start();//开始计时
Console.WriteLine("");
Console.WriteLine("");
Console.WriteLine("ArryList集合存储数据量为10000000,初始化一个长度,执行开始:"); ArrayList arrayList = new ArrayList(); //// 定义一个数组
for (int i = ; i < ; i++)
{
arrayList.Add( + );
} st.Stop();//终止计时
Console.WriteLine(string.Format("ArryList集合存储数据量为10000000,初始化一个长度,执行完毕:!总耗时{0}毫秒", st.ElapsedMilliseconds.ToString())); //// 需要统计时间的代码段(统计初始化非指定长度时的执行时间) st.Restart();
Console.WriteLine("");
Console.WriteLine("ArryList集合存储数据量为10000000,初始化不指定长度,执行开始:"); arrayList = new ArrayList(); //// 定义一个数组
for (int i = ; i < ; i++)
{
arrayList.Add( + );
} st.Stop();//终止计时
Console.WriteLine(string.Format("ArryList集合存储数据量为10000000,初始化不指定长度,执行完毕:!总耗时{0}毫秒", st.ElapsedMilliseconds.ToString()));
}
}

四、List集合简介

随着c#泛型的推出,为了避免ArrayList一些缺点,微软推出了List集合
List集合内部还是采用的Array实现,同时在定义时需要指定对应的数据类型
这样级保留了Array集合的优点,同时也避免了ArrayList集合的数据类型不安全和装箱带来的性能牺牲
List特点:

  • 1、数据长度不固定,自动增加
  • 2、存储相同的数据类型
  • 3、可根据索引查询,查询效率快

优缺点:
优点:
1、长度不固定,在定义是不必担长度溢出
2、存储相同数据类型的数据,避免的数据的装箱拆箱,提高了数据处理效率
3、支持索引查询,查询效率快
缺点:
1、由于长度不固定,执行效率低下,因为超出默认长度(10)后,会自动扩容拷贝数据,牺牲性能
2、线程不安全,因为其内部实现是用size、array来共同控制,在新增操作时是非原子操作,所以非安全线程

练习实例代码:

   /// <summary>
/// List练习操作
/// </summary>
public class ListTest
{
/// 随着c#泛型的推出,为了避免ArrayList一些缺点,微软推出了List集合
/// List集合内部还是采用的Array实现,同时在定义时需要指定对应的数据类型
/// 这样级保留了Array集合的优点,同时也避免了ArrayList集合的数据类型不安全和装箱带来的性能牺牲
/// List特点:
/// 1、数据长度不固定,自动增加
/// 2、存储相同的数据类型
/// 3、可根据索引查询,查询效率快
///
/// 优缺点:
/// 优点:
/// 1、长度不固定,在定义是不必担长度溢出
/// 2、存储相同数据类型的数据,避免的数据的装箱拆箱,提高了数据处理效率
/// 3、支持索引查询,查询效率快
/// 缺点:
/// 1、由于长度不固定,执行效率低下,因为超出默认长度(10)后,会自动扩容拷贝数据,牺牲性能
/// 2、线程不安全,因为其内部实现是用size、array来共同控制,在新增操作时是非原子操作,所以非安全线程 /// ArrayList操作实例
public static void ListOpert()
{
//// 定义一个秒表,执行获取执行时间
Stopwatch st = new Stopwatch();//实例化类
st.Start();//开始计时
//// 需要统计时间的代码段(统计初始化长度时的执行时间)
Console.WriteLine("");
Console.WriteLine("");
Console.WriteLine("List集合存储数据量为10000000,初始化一个长度,执行开始:"); List<int> list = new List<int>(); //// 定义一个数组
for (int i = ; i < ; i++)
{
list.Add( + );
} //需要统计时间的代码段 st.Stop();//终止计时
Console.WriteLine(string.Format("List集合存储数据量为10000000,初始化一个长度,执行完毕:!总耗时{0}毫秒", st.ElapsedMilliseconds.ToString())); //// 需要统计时间的代码段(统计初始化非指定长度时的执行时间)
st.Restart();
Console.WriteLine("");
Console.WriteLine("List集合存储数据量为10000000,初始化不指定长度,执行开始:"); list = new List<int>(); //// 定义一个数组
for (int i = ; i < ; i++)
{
list.Add( + );
} st.Stop();//终止计时
Console.WriteLine(string.Format("List集合存储数据量为10000000,初始化不指定长度,执行完毕:!总耗时{0}毫秒", st.ElapsedMilliseconds.ToString()));
}
}

五、LinkedList集合简介

LinkedList链表的底层是采用双向链表的方式实现,
在链表(Linked List)中,每一个元素都指向下一个元素,以此来形成了一个链(chain)
可以从头部和尾部插入数据,在存储内存上采用非连续方式存储,链表有如下一些特点

  • 1、内存存储上是非连续的
  • 2、能够支持从头部和底部同时插入
  • 3、长度是非固定的

优缺点:
优点:
1、由于非连续存储,中部插入和删除元素效率高
2、长度非固定,在创建时不用考虑其长度
3、可以冲头部和底部添加元素
4、数据类型是安全的,在创建时需要指定的数据类型
缺点:
1、由于非连续存储,不能通过小标访问,查询效率低

练习实例代码:

    /// <summary>
/// LinkedList练习操作
/// </summary>
public class LinkedListTest {
/// LinkedList链表的底层是采用双向链表的方式实现,
/// 在链表(Linked List)中,每一个元素都指向下一个元素,以此来形成了一个链(chain)
/// 可以从头部和尾部插入数据,在存储内存上采用非连续方式存储,链表有如下一些特点
/// 1、内存存储上是非连续的
/// 2、能够支持从头部和底部同时插入
/// 3、长度是非固定的
/// 优缺点:
/// 优点:
/// 1、由于非连续存储,中部插入和删除元素效率高
/// 2、长度非固定,在创建时不用考虑其长度
/// 3、可以冲头部和底部添加元素
/// 4、数据类型是安全的,在创建时需要指定的数据类型
/// 缺点:
/// 1、由于非连续存储,不能通过小标访问,查询效率低 /// LinkedList操作实例
public static void LinkedListTestOpert() {
//// 定义一个秒表,执行获取执行时间
Stopwatch st = new Stopwatch();//实例化类
st.Start();//开始计时
//// 需要统计时间的代码段(统计初始化长度时的执行时间)
Console.WriteLine("");
Console.WriteLine("");
Console.WriteLine("Linked集合存储数据量为10000000,执行开始:"); LinkedList<int> list = new LinkedList<int>(); //// 定义一个数组
for (int i = ; i < ; i++)
{
list.AddFirst( + );
} //需要统计时间的代码段 st.Stop();//终止计时
Console.WriteLine(string.Format("Linked集合存储数据量为10000000,执行完毕:!总耗时{0}毫秒", st.ElapsedMilliseconds.ToString()));
}
}

六、每种集合数据执行结果对比分析

    class Program
{
static void Main(string[] args)
{
//// array数组操作测试
ArrayTest.IntArrayTest(); //// arrayList集合操测试
ArrayListTest.ArrayListOpert(); //// List集合操作测试
ListTest.ListOpert(); //// LinkedList集合操作测试
LinkedListTest.LinkedListTestOpert(); ///// 通过测试数据
//通过测试数据大概可以分析得出一些结论
//1、整体效率上Array效率最高,ArrayList效率最低,List效率介于Array和ArrayList之间
//2、ArrayList和List集合,在定义时如果知道数据长度,那么初始化时,指定长度的效率比不指定的长度效率高 //总结:
//在数据集合使用选择上给出以下一些建议:
//1、Array:当元素的数量是固定的,并且需要使用下标时
//2、ArrayList:当存储的元素类型不同时
//3、List:当元素的数量是固定的,并且需要使用下标时
//4、LinkedList:当元素需要能够在列表的两端添加时
Console.ReadLine();
}
}

  执行结果数据

通过测试数据大概可以分析得出一些结论
1、整体效率上Array效率最高,ArrayList效率最低,List效率介于Array和ArrayList之间
2、ArrayList和List集合,在定义时如果知道数据长度,那么初始化时,指定长度的效率比不指定的长度效率高

七、总结:

在数据集合使用选择上给出以下一些建议:
1、Array:当元素的数量是固定的,并且需要使用下标时
2、ArrayList:当存储的元素类型不同时,初始化时给一个预估的长度
3、List:当元素的数量是固定的,并且需要使用下标时,初始化时给一个预估的长度
4、LinkedList:当元素需要能够在列表的两端添加时

附件:

关于这一些练习的代码,上传到github,有兴趣的可以看一下:

https://github.com/xuyuanhong0902/dataStructureTest.git

c#数据结构之Array、ArrayList、List、LinkedList对比分析的更多相关文章

  1. Java中arraylist和linkedlist源代码分析与性能比較

    Java中arraylist和linkedlist源代码分析与性能比較 1,简单介绍 在java开发中比較经常使用的数据结构是arraylist和linkedlist,本文主要从源代码角度分析arra ...

  2. List集合总结,对比分析ArrayList,Vector,LinkedList

    前面已经写了三篇关于Java集合的文章,包括: Java集合 ArrayList原理及使用 再说Java集合,subList之于ArrayList Java集合 LinkedList的原理及使用 关于 ...

  3. [源码分析]ArrayList和LinkedList如何实现的?我看你还有机会!

    文章已经收录在 Github.com/niumoo/JavaNotes ,更有 Java 程序员所需要掌握的核心知识,欢迎Star和指教. 欢迎关注我的公众号,文章每周更新. 前言 说真的,在 Jav ...

  4. Java数据结构之表的增删对比---ArrayList与LinkedList之一

    一.Java_Collections表的实现 与c不同Java已经实现并封装了现成的表数据结构,顺序表以及链表. 1.ArrayList是基于数组的实现,因此具有的特点是:1.有索引值方便查找,对于g ...

  5. ArrayList和LinkedList的几种循环遍历方式及性能对比分析(转)

    主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性能测试对比,根据ArrayList和LinkedList的源码实现分析性能结果,总结结论. 通过本文你可以 ...

  6. ArrayList和LinkedList的几种循环遍历方式及性能对比分析

    最新最准确内容建议直接访问原文:ArrayList和LinkedList的几种循环遍历方式及性能对比分析 主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性 ...

  7. ArrayList和LinkedList的几种循环遍历方式及性能对比分析(转载)

    原文地址: http://www.trinea.cn/android/arraylist-linkedlist-loop-performance/ 原文地址: http://www.trinea.cn ...

  8. ArrayList和LinkedList遍历方式及性能对比分析

    ArrayList和LinkedList的几种循环遍历方式及性能对比分析 主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性能测试对比,根据ArrayLis ...

  9. 【转】ArrayList和LinkedList的几种循环遍历方式及性能对比分析

    原文网址:http://www.trinea.cn/android/arraylist-linkedlist-loop-performance/ 主要介绍ArrayList和LinkedList这两种 ...

随机推荐

  1. Redis开发与运维:数据迁移(下)

    上一篇,有朋友留言redis-port,借此机会我尝试使用一下redis-port这个同步工具 redis-port 已编译版 https://github.com/CodisLabs/redis-p ...

  2. Windows常用操作

    目录 查询IP地址 常用快捷键 显示文件后缀名 查询IP地址 1.进入到dos界面 2.输入命令: ipconfig 常用快捷键 快捷键 作用 win+E 打开计算机 win+R 打开运行 win+R ...

  3. webshell检测方法归纳

    背景 webshell就是以asp.php.jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称做为一种网页后门.黑客在入侵了一个网站后,通常会将asp或php后门文件与网站服务器WEB ...

  4. lodash 学习笔记

    一.介绍 官方文档: 中文 - https://www.lodashjs.com/docs/latest 英文- https://lodash.com/docs/4.17.15 1.作用 lodash ...

  5. 生产环境下,MySQL大事务操作导致的回滚解决方案

    如果mysql中有正在执行的大事务DML语句,此时不能直接将该进程kill,否则会引发回滚,非常消耗数据库资源和性能,生产环境下会导致重大生产事故. 如果事务操作的语句非常之多,并且没有办法等待那么久 ...

  6. c++11::std::is_same/decay

    #include <type_traits> std::is_same 判断类型是否一致 通过std::is_same即可判断两个类型是否一样,特别在模板里面,在不清楚模板的参数时,此功能 ...

  7. UNCTF杂项题Hidden secret 之NTFS交换数据流隐写

    ---恢复内容开始--- 做这道题目的经历比较坎坷,题目中用于隐藏flag的jpg文件出了问题,导致不能被交换数据流隐写所以出题人换了一次题目,最后做法也换了,不过出题人一开始的考察点还是基于NTFS ...

  8. Spring 框架基础(04):AOP切面编程概念,几种实现方式演示

    本文源码:GitHub·点这里 || GitEE·点这里 一.AOP基础简介 1.切面编程简介 AOP全称:Aspect Oriented Programming,面向切面编程.通过预编译方式和运行期 ...

  9. 不想用锐捷怎么办?锐捷出问题|锐捷不能用怎么办?用menohust代替吧

    首先获取 MentoHUST(代替锐捷网络认证客户端) V4.1.0.2001 绿色免费版 解压到任意目录 用管理员身份 启动  安装&卸载 .bat(右键用管理员运行)  这个文件可能乱码了 ...

  10. ThreadLocal小试牛刀

    ThreadLocal中保存的数据只能被当前线程私有,不被其它线程可见 证明 声明一个全局的变量threadLocal,初始值为1,通过3个线程对其进行访问修改设置,理论上threadLocal的最终 ...