arraylist 线程安全_数据结构之Array、ArrayList、List、LinkedList对比分析
作者:小许子
https://www.cnblogs.com/xiaoXuZhi/p/XYH_dataStructureTest_array.html
一、前言:
在c#数据结构中,集合的应用非常广泛,无论是做BS架构还是CS架构开发,都离不开集合的使用,比如我们常见的集合包括:Array、ArrayList、List、LinkedList等。这一些数据集合,在功能上都能够实现集合的存取,但是他们内部有什么区别,在使用时需要注意一些什么呢?下面根据个人的经验,对这一些集合数据的使用做一个简单的小结,如果说的不对的地方,欢迎指出,多多交流改进。
二、Array集合简介
Array集合,也就是数组,是最简单的数据结构,其存储的数据在内存空间是连续的,数组有一下一些特点
1.数据存储是连续的
2.数组长度在定义时就必须制定
3.数组存储的数据类型都是同一类型
4.数组可以直接通过小标访问
优缺点: 优点: 1、可以根据索引直接访问,访问速度快 2、数据是安全的,由于数据类型一致性,在存储使用过程中不涉及 缺点: 1、由于数据是连续存储的,导致插入效率变慢 2、由于数组长度大小固定,那么对预期非固定长度的数字不好处理
练习实例代码:
/// /// 数组练习操作 /// 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[10000000]; for (int i = 0; i < 10000000; i++) { nums[i] = 1 + 1; } //需要统计时间的代码段 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来共同控制,在新增操作时是非原子操作,所以非安全线程使用技巧:在实际使用过程中,为了避免自动扩容,可以预估数据长度,初始化一个数据长度,从而提高效率
练习实例代码:
/// /// ArrayList数组练习操作 /// 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(10000000); //// 定义一个数组 for (int i = 0; i < 10000000; i++) { arrayList.Add(1 + 1); } 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 = 0; i < 10000000; i++) { arrayList.Add(1 + 1); } 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来共同控制,在新增操作时是非原子操作,所以非安全线程
练习实例代码:
/// /// List练习操作 /// 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>(10000000); 定义一个数组 for (int i = 0; i < 10000000; i++) { list.Add(1 + 1); } //需要统计时间的代码段 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 = 0; i < 10000000; i++) { list.Add(1 + 1); } 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、由于非连续存储,不能通过小标访问,查询效率低
练习实例代码:
/// /// LinkedList练习操作 /// 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 = 0; i < 10000000; i++) { list.AddFirst(1 + 1); } //需要统计时间的代码段 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:当元素需要能够在列表的两端添加时
长按打开更多惊喜
arraylist 线程安全_数据结构之Array、ArrayList、List、LinkedList对比分析相关推荐
- java arraylist线程安全_面试题1:ArrayList 是线程安全的吗?如果要实现一个线程安全的List应该怎么做?...
ZJ面试被问到的问题,我们来一个一个问题看 首先第一个问题,ArrayList是线程安全的吗? 答案是不是,我们可以看看ArrayList的源代码 public E set(int index, E ...
- java 线程僵死_一次线上jboss僵死问题分析
问题再现: 个人中心在上周四上线(2012.9.13)第一次上线,由于种种缘由,遗留了部分低级别的BUG,后于次日修复,下午4时再次上线. 当日晚上8点,运维发现user-web 五台服务器中四台jb ...
- 模糊pid控制的温度系统matlab源代码_模糊PID控制系统(二)对比分析
0 参考资料 模糊PID是以误差e和误差的变化率ec作为输入,利用设定好的模糊规则表,找出PID三个参数与e和ec之间的模糊关系. 在运行中不断检测e和ec,根据模糊控制原理,来对3个参数进行在线修改 ...
- 进程 线程 协程 各自的概念以及三者的对比分析
文章目录 1 进程 2 线程 3 进程和线程的区别和联系 3.1 区别 3.2 联系 4 举例说明进程和线程的区别 5 进程/线程之间的亲缘性 6 协程 线程(执行一个函数)和协程的区别和联系 协程和 ...
- 各大媒体优劣对比_户外广告媒体类型与优缺点对比分析
凡是能在露天或公共场合通过广告表现形式同时向无以计量的消费者进行广告传播的,都可以定义为户外广告,户外广告是一种媒体类型丰富.表现形式多样.发展速度较快的广告模式,那么户外广告具体有哪些类型呢?户外广 ...
- 人工雨量计_遥测雨量计与人工雨量观测对比分析
1概况宝鸡水文局选用2014年资料共16站,对比误差R5%,有5宝鸡地处关中平原西部,是国家规划建设的关中-天水经济区站;5%R10%,有3站;10%R15%,有5站;R>15%,有3站.副中心 ...
- 如何使ArrayList 线程安全
转载自 如何使ArrayList 线程安全 ArrayList是线程不安全的,轻量级的.如何使ArrayList线程安全? 1.继承Arraylist,然后重写或按需求编写自己的方法,这些方法要写成 ...
- arraylist 初始化_第一章 C#数据结构--数组和ArrayList
数组是最通用的数据结构,它出现在几乎所有的编程语言里.在 C#语言中使用数组包括创建 System.Array 类型的数组对象,以及创建针对所有数组的抽象的基类型.Array 类提供了一套方法,这些方 ...
- [转]Vector、ArrayList和hashtable hashmap数据结构
线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中.本文试图通过简单的描述,向读者阐述各个类的作用以 ...
最新文章
- cygwin用命令安装软件_Cygwin本地安装版
- 台式计算机时间不准,每天开机电脑时间都不正确怎么办?试试这个办法!
- django 跳转其他网站_Django 实战 | 搭一个 GitHub 用户展示网站 04
- appium 处理滑动的方法
- 简明 MongoDB 入门教程 1
- L1-002 打印沙漏 (20 分)—团体程序设计天梯赛
- 计算机组成原理完整学习笔记(一):计算机系统概论
- linux中nbu主机备份,NBU60网络备份大全之Linux设备管理.doc
- 系统集成项目管理工程师考试大纲和复习知识点
- 【图解线性代数】第一章——线性代数的几何意义导读(思维导图)
- py之基于分块运动补偿的视频压缩
- gopher攻击mysql_CTFweb类型(二十七)gopher对mysql的利用及例题讲解
- java选取最大数字_用Java程序找最大的数字(4.1)
- 编程语言介绍以及特点
- 【谷歌浏览器打不开Axure解决办法~】
- App开发者如何选择移动广告平台1 - 开发者规模分析
- 钉钉发布会发了个“ / ”,还说这玩意能替我们上班?
- 如何使用wifi模块搭建农业物联网防治马铃薯晚疫病?
- 科技百咖 | 对话智达方通CEO蔡志宏:“多维数据仓库”是企业业务管理的未来...
- OpenSSL SM4加密 CMake工程链接失败
热门文章
- 数据库连接数过多 too many
- 使用JestClient操作ElasticSearch
- 浅谈Spring5 响应式编程
- 多线程池、饱和策略详解
- 《树莓派Python编程入门与实战》——1.7 排除树莓派的故障
- 解决【Unable to find the requested .Net Framework Data Provider. It may not be installed.】错误...
- 【OpenCV】图像几何变换:旋转,缩放,斜切
- BIEE连接数据库的方法
- OAF_VO系列1 - Accelerator Keys
- homebrew install php53