美文网首页
JAVA 源码之(ArrayList VS LinkedList

JAVA 源码之(ArrayList VS LinkedList

作者: 东风依旧788 | 来源:发表于2018-02-09 14:23 被阅读0次
    ArrayList
    • 默认构造一个空的数组
    • 默认大小为DEFAULT_CAPACITY(10),在首次调用add方法时进行初始化
    • 自动扩展方法:当数组满时,进行1.5倍扩容
    • 特殊方法说明
      • add(index,element):将element添加到index位置,原来index元素依次进行后移动,元素size++
    • modCount 记录了队列的变化次数(具体指List大小发生变化的次数),list在遍历之前记录下当前mod,遍历过程随时检查mod是否变化,当发生变化是将抛出异常
    • 通过迭代器的方式进行List的遍历,可以进行List的mode追踪
    • 内部迭代器
      • Itr
        • 通过iteator()方法获取
        • 由第一个元素开始向后遍历
      • ListItr
        • 通过listIterator(index)进行获取
        • 随机指定位置的迭代器访问,可以向前也可以向后
        • 迭代器可以获取当前位置,前置元素和后置元素
      • Spliterator 为并行遍历数据设计的迭代器
        • Java8新增接口
        • trySplit尝试对现在的list进行1/2分割,如果无法分割将返回null
        • tryAdvance 处理所有元素,当没有元素处理时,返回false
    • 元素的移除
      • remove(index) 一次的元素移动(拷贝index之后的数据,数组并不会进行回收,队形空间将被回收)
      • remove(Object) 删除第一个相等的对象,一次的数据移动
      • removeAll 删除多个元素多个元素,相同的也将被删除,可能有一次的数组拷贝动作(发生异常的情形下)
      • removeIf
      • trimToSize List
    • retainAll 取集合之间交集
    • SubList List的一个子集,和List共同使用数据,subList的变更将影响list的数据;list变更将导致subList无法正常使用(抛出ConcurrentModificationException异常)
    LinkedList
    • 其实现是一个双向链表
    • 内部数据结构
      • Node
        • 保存节点数据
        • 保存一个向前指针和向后指针
      • ListItr 顺序迭代器
      • DescendingIterator 倒序迭代器
    ArrayList VS LinkedList
    • 内部事项方式的差异
      • 以数组为基础的ArrayList
      • 以链表为节点的LinkedList
    • 随机访问性能对比: ArrayList优于LinkedList
    • 节点的插入和删除
      • ArrayList需要进行数组的自动扩展和数组的拷贝
      • LinkedList 对于内存使用更加充分
    • 通过modCount 对List的追踪,对List进行非读操作时,mod将进行变化
    • 通过迭代器进行访问,可是追踪到List是否有其他线程进行操作

    相关文章

      网友评论

          本文标题:JAVA 源码之(ArrayList VS LinkedList

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