List剖析

作者: 我家菇凉 | 来源:发表于2020-01-07 14:56 被阅读0次

List 继承于IList,IReadOnlyList,IList是提供了主要的接口,IReadOnlyList提供了迭代接口。

List内部是用数组实现的,而不是链表,并且当没有给予指定容量时,初始的容量为0。

每次增加一个元素的数据,Add接口首先检查的是容量还够吗,如果不够则用 EnsureCapacity 来增加容量。

在 EnsureCapacity 中,

int newCapacity = _items.Length == 0? _defaultCapacity : _items.Length * 2;

每次容量不够的时候,整个数组的容量都会扩充一倍,_defaultCapacity 是容量的默认值为4. 所以整个扩充的路线为4,8,16,32,64,128,256,512,1024....

用数组形式作为底层数据结构,好处是使用索引方式提取元素很快,但在扩容的时候就很糟糕了,每次new数组都会造成内存垃圾,这给垃圾回收GC带来了很多负担。一次性扩充更多的数组容量为GC减轻了负担,但数组连续的new也还是GC的不小负担,特别是代码中List频繁使用的Add时。另外,如果数量不得当也会浪费大量内存空间,比如当元素数量为 520 时,List 就会扩容到1024个元素,如果不使用剩余的504个空间单位,就造成了大部分的内存空间的浪费。

Remove接口中包含了 IndexOf 和 RemoveAt,用 IndexOf 找到元素的索引位置,用 RemoveAt 删除指定位置的元素。删除的原理其实就是用 Array.Copy 对数组进行覆盖。IndexOf 启用的是 Array.IndexOf 接口来查找元素的索引位置,这个接口内部实现是就是按索引顺序从0到n对每个位置的比较,复杂度为O(n)。

与Add接口一样,先检查容量是否足够,不足则扩容。插入元素时,则以拷贝数组的形式,将数组里的指定元素后面的元素向后移动一个位置。

到这里,可以知道List的Add,Insert,IndexOf,Remove接口都是没有优化过的,如果过于频繁使用的话,会导致CPU使用过高,造成不少内存的冗余,也会使得垃圾回收(GC)时承担了更多的压力。

AddRange,RemoveRange的原理和Add与Remove是一样的,只是多了几个元素,把单个元素变成了以容器为单位的形式进行操作。都是先检查容量是否合适,不合适则扩容,以及Remove时先得到索引位置再进行整体的覆盖删掉的元素。

从上看得出来,代码是线程不安全的。所以最好别使用公用的 List 来添加,并发情况下,无法判断 _size++ 的执行顺序。

List 并不是高效的组件,真实情况是,他比数组的效率还要差的多,他只是个兼容性比较强得组件而已,好用,但效率差。

相关文章

  • List剖析

    List 继承于IList,IReadOnlyList,IList是提供了主要的接口,IReadOnlyList提...

  • Java集合总结

    剖析面试最常见问题之Java集合 1.说说list、set和map的区别?    1.list是有序可重复;   ...

  • 自己实现C++list容器

    最近在研究stl源码剖析,于是乎自己动手实现了一个自己的list容器,当然是最简单的list和标准库的list有很...

  • Java集合框架常见面试题(干货)

    剖析面试最常见问题之Java基础知识 说说List,Set,Map三者的区别? List(对付顺序的好帮手): L...

  • javase-List【源码剖析】

    参考原文地址 前言 声明,本文用得是jdk1.8现在这篇主要讲List集合的三个子类: ArrayList底层数据...

  • 《STL源码剖析》笔记:list

    对于vector而言,list就要复杂得多,list 有2个特点: 相较于vector,它的好处是每次插入一个或删...

  • TreeMap就这么简单【源码剖析】

    前言 声明,本文用得是jdk1.8 前面章节回顾: Collection总览 List集合就这么简单【源码剖析】 ...

  • 3分钟搞掂Set集合

    前言 声明,本文用的是jdk1.8 前面章节回顾: Collection总览 List集合就这么简单【源码剖析】 ...

  • ConcurrentHashMap基于JDK1.8源码剖析

    前言 声明,本文用的是jdk1.8 前面章节回顾: Collection总览 List集合就这么简单【源码剖析】 ...

  • javase-Map集合、散列表、红黑树介绍

    参考文章地址 前面已经讲了Collection的总览和剖析List集合:原本我是打算继续将Collection下的...

网友评论

    本文标题:List剖析

    本文链接:https://www.haomeiwen.com/subject/rhwractx.html