ArrayList和LinkedList怎么选,想过吗?

年少往事

记得刚学数据链表的时候,老师是不是说,读多写少用数组,写多读少用链表,但你有没有想过多少才算多?我也有这个疑问,刚好今天有时间,借这个话题一起探讨,ArrayList和LinkedList选择之写操作。

专注于为中小企业提供网站制作、成都网站建设服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业山南免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了上千企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。

磁盘IO

我们都知道,磁盘IO以块为单位读取数据,如果你所需要的数据都存储在一个块呢,一次IO即可返回。如果跨越多个块,只要你的块是连续的,类似MYSQl,基于预读机制,一次读取多个块的数据。这明显利好数组,因为数组申请内存的时候,大小是固定且连续的。如果是链表,它的数据随机散落在不同的块,意味着磁盘IO很快。

小结

  1. 数组读性能好是因为数据顺序存储,一次IO即可返回
  2. 链表读性能差是因为数据随机存储,多次IO才能返回

扩容

我们都知道,ArrayList存在扩容问题,在频繁写入的时候,会因为容量不足需要重写开辟新的数组空间,然后复制原数组数据到新的数组,这个过程消耗大量内存,这也是提出写多用链表的原因。

那么,是不是只要写多就用链表?这个回答显然是否定的,不然没有探讨的意义。下面我们看看大数据量下两者写入差异。

小试牛刀,500万数据看看

ArrayList初始容量1万,循环插入500万数据,扩容9次,用时138ms,LinkedList只需要不停创建节点,将节点next绑定即可,但用时724ms,差距5倍多。

小结

500万数据写入,用ArrayList是上策。不过能接触到这么多数据量的情况并不多,实际使用以实际情况为准,多测测你的业务和机器选择比较好,不过对于我来说,优先考虑ArrayList,因为从GC的角度来说,顺序存储利于GC,不管是CMS还是G1。

加量-1千万

可以看到,一千万数据量依然有接近3倍的差异,看到这你还犹豫什么,无脑ArrayList

2千万

没想到2千万就被反超了,但是你以为这样会说服我使用LinkedList吗,我只能说Naive

3千万

已持平!

4千万

重新反超,这么大的数据量下,linkedList创建大量node,比需要开辟新数组内存的arrayList消耗的时间更多,内存也更多,不信Jmap看看?而arrayList可是扩容了12次

结论

没得出什么牛逼结论,反而看出两个list在大数据量情况下,性能不是一定谁更好,可能是两条有多个交点的曲线。在选择上,无脑arrayList,如果是重要场景,最好根据业务和机器配置选择合适的。但业务会增长,摸着良心问自己,业务增长到另一个交点的时候,你会改过来吗!

文章题目:ArrayList和LinkedList怎么选,想过吗?
网址分享:http://www.hantingmc.com/qtweb/news34/220334.html

成都网站建设公司_创新互联,为您提供网站维护微信小程序标签优化网站营销虚拟主机网站制作

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联