终于被一个年轻程序员同事抓到了我代码中的一个值得讨论的问题,这个同事(下称小吴)在看我CSharp代码的时候发现了代码里面有一个写得不是那么严谨的逻辑,就是我在存某个数据集合的时候是已经确定了数据集合的长度的,但是我用的是List(集合)而非数组。他告诉我,如果在已经确定了数据长度的情况下,使用List的开销是要比使用数组的开销大的。我一想,好像是这个道理哦,然后就一拍脑袋表现出恍然大悟的样子。

打开网易新闻 查看精彩图片

数组和集合的差别

小吴说的是对的,在已经确定了数据长度的情况下,使用数组是要比使用List有优势的,使用数组时已经预设了数组长度,那么就意味着不需要像List一样每次在集合内新增数据的时候都需要重新申请内存块,其次,在多线程的情况下,使用List是需要考虑线程安全的问题的。

打个比方就像我们公司要去外地玩公司总共有30个人需要预定酒店房间,数组就相当于公司在我们去之前就已经预定好了,到时候一个萝卜一个坑即可。而List则相当于到了地方以后公司才给我们定房间,而此时可能会发生以下故事:

酒店房间不够了,只能先安排一部分人住进去,等其他房间空闲的时候再安排剩下的人,此时,有些同事因为关系好实在等不起,所以就决定两个人或者多个人挤一挤。此时,公司老王没经过公司前台同意,拎着行李就要和公司前台住一个房间,结果公司前台反手就给老王轰了出去。有些人正在等空房间的同事不耐烦了,想要插队,结果和其他同事产生了冲突,最后导致整个公司的人都被轰出了酒店,酒店方说:“等你们商量好了再决定住不住,不要在酒店里闹!”。

这个比方是不是特别合适?

即使数组性能好,也不是非用不可

我脑子里正在歪歪呢,小吴见我无动于衷,然后就直接反编译出List的源码给我看,想让我看看List在添加数据的时候都做了什么操作。

只见源码里显示,在每次调用List的Add方法时,List都重新申请了一个数组,并且重新预设数组长度。

打开网易新闻 查看精彩图片

然后我配合小吴说:“真的哎!”。

此时,小吴的表情特别逗,指着源码看着我,好像在说:“是吧!那你还不快去改!”。

我承认,我写这块代码的时候的确没有考虑到在已知数据长度的情况下使用数组是最好的,在写的时候只是觉得使用List相对于使用数组来说,比较方便。但小吴说的虽然对,可我觉得代码仍然没有修改的必要!因为我程序里使用的是分页查询,每次只取100条数据,所以数据长度才会固定,且数据只在单线程下使用,取用数据的频率也不高,即使改成了数组,其实对于程序性能的提升也起不到多大作用。

为了不打击年轻程序员的积极性,我告诉他,我有空再改!

结语

不可否认,当数据量大、数据操作频繁、不固定线程的情况下,使用数组来存储数据是比使用List效率高的,而且基本上也不会出现线程安全的问题。

但是List存在当然有它存在的道理,处理小批量数据,它的性能不会比数组差多少!且数组有一个弊端,那就是因为数组是预设数组长度,如果数据长度达不到,反而是对系统资源的浪费!

不同编程语言有不同编程语言的理解,不知在您使用的编程语言中,数组和List(集合)的有优劣是怎样的?