• 容器ArrayList原理(学习)


    一、概述

    动态数组,容量能动态增长,元素可以为null,用数组存储,非线程同步(vector线程同步)

    每个 ArrayList 实例都有一个容量,该容量是指用来存储列表元素的数组的大小,自动增长(默认初始大小为10,然后递增式大约1.5倍增长)会带来数据向新数组的重新拷贝,因此,如果可预知数据量的多少,可在构造 ArrayList 时指定其容量。在添加大量元素前,应用程序也可以使用 ensureCapacity 操作来增加 ArrayList 实例的容量,这可以减少递增式再分配的数量。

    二、实现

    底层为数组存储;

     add操作 =》

    先ensureCapacity ;扩容 newCapacity = (oldCapacity * 3)/2 + 1;之后Arrays.copyOf数组拷贝;

     get操作=》

    index越界抛异常

     remove操作=》

    public E remove(int index) :return oldValue;        数据再拷贝使用  System.arraycopy

    public boolean remove(Object o) 


    三、容量增长,使用注意点

    数组进行扩容时,会将老数组中的元素重新拷贝一份到新的数组中,每次数组容量的增长大约是其原容量的 1.5 倍(从newCapacity = (oldCapacity * 3)/2 + 1;)
    这种操作的代价是很高的,因此在实际使用时,我们应该尽量避免数组容量的扩张。
    当我们可预知要保存的元素的多少时,要在构造 ArrayList 实例时,就指定其容量,以避免数组扩容的发生。

    或者根据实际需求,通过调用ensureCapacity 方法来手动增加 ArrayList 实例的容量


    四、Fail-Fast 机制


  • 相关阅读:
    ES monitoring
    my stackoverflow
    ES 监控
    Natural Language Processing 课程,文章,论文
    搜索引擎名著
    https://medium.com/netflix-techblog/linux-performance-analysis-in-60-000-milliseconds-accc10403c55
    MySQL 性能跟踪方法
    JAVA CAS原理深度分析 volatile,偏向锁,轻量级锁
    spark-architecture-shuffle
    Linux performance commands and tool
  • 原文地址:https://www.cnblogs.com/lwcoding/p/6971077.html
Copyright © 2020-2023  润新知