• 你真的懂ArrayList吗?


    ArrayList底层原理

    数组

    ​ 1.ArrayList动态扩容的方法?

    1. 使用空参创建集合,在底层创建一个长度默认为0的数组;
    2. 添加第一个元素时,底层会创建一个数组长度为10的数组;
    3. 存满的时候,数组会自动扩容1.5倍;
    4. 如果1.5倍的数组长度还放不下的时候,则新创建的数组长度应该是实际的数组长为准,比如现在的数组的长度为10,要添加100的元素,那么需求的数组长度为110;

    2.源代码

        //transient 关键字修饰时,表示它不会被默认的序列化和反序列化机制所处理。
        transient Object[] elementData;
    
        //空参构造
        public ArrayList() {
            this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
        }
    
        //向数组添加元素,size则为下一个需要添加元素的位置
        private void add(E e, Object[] elementData, int s) {
            if (s == elementData.length)
                elementData = grow();
            elementData[s] = e;
            size = s + 1;
        }
    
        //数组扩容的方法
        private Object[] grow(int minCapacity) {
            int oldCapacity = elementData.length;
            if (oldCapacity > 0 || elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
                int newCapacity = ArraysSupport.newLength(oldCapacity,
                        minCapacity - oldCapacity, /* minimum growth */
                        oldCapacity >> 1           /* preferred growth */);
                return elementData = Arrays.copyOf(elementData, newCapacity);
            } else {
                return elementData = new Object[Math.max(DEFAULT_CAPACITY, minCapacity)];
            }
        }
    
        private Object[] grow() {
            return grow(size + 1);
        }
    
        public static int newLength(int oldLength, int minGrowth, int prefGrowth) {
            // assert oldLength >= 0
            // assert minGrowth > 0
    
            int newLength = Math.max(minGrowth, prefGrowth) + oldLength;
            if (newLength - MAX_ARRAY_LENGTH <= 0) {
                return newLength;
            }
            return hugeLength(oldLength, minGrowth);
        }
    
        private static int hugeLength(int oldLength, int minGrowth) {
            int minLength = oldLength + minGrowth;
            if (minLength < 0) { // overflow
                throw new OutOfMemoryError("Required array length too large");
            }
            if (minLength <= MAX_ARRAY_LENGTH) {
                return MAX_ARRAY_LENGTH;
            }
            return Integer.MAX_VALUE;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

  • 相关阅读:
    机场信息发布系统解决方案,到底有多好用
    【Autopsy数字取证篇】Autopsy数字取证软件的下载安装与优化配置
    ubuntu 安装 k8s 记录 2 初始化
    【漏洞复现】Apache_Shiro_1.2.4_反序列化漏洞(CVE-2016-4437)
    C++初阶(stack+queue)
    IDA动态调试apk
    铸坯火焰自动切割系统的设计状况及存在的问题
    计算机毕业设计SSM电子投票系统【附源码数据库】
    基于LLMs的多模态大模型(Visual ChatGPT,PICa,MM-REACT,MAGIC)
    LabVIEW示波器连续触发编程
  • 原文地址:https://blog.csdn.net/weixin_44749255/article/details/133203263