2024-07-05 16:30阅读: 5评论: 0推荐: 0

ArrayList底层结构和源码分析

        // 无参构造器创建ArrayList对象
//        ArrayList list =new ArrayList();   // 断点1
        ArrayList list =new ArrayList(8);   // 断点2
        // 添加1-10数据
        for (int i = 0; i <= 10; i++) {
            list.add(i);
        }
        // 添加11-15数据
        for (int i = 11; i <= 15; i++) {
            list.add(i);
        }
        list.add(100);
        list.add(200);
  1. permits all element,including null,ArrayList 可以加入(多个)null,
  2. ArrayList是由数组来实现存储的
  3. ArrayList吧基本等于Vector,除了ArrayList是线程不安全(执行效率高)通过源码可以查看到多线程不使用ArrayList。

通过源码可以得知add方法没有synchronized;即没有线程安全控制。

  1. ArrayList中维护了一个Object类型的数组elementData. transient(表示,“瞬间”,该属性不会被序列化) Object[] elementsData;
  2. 当创建了ArrayList对象时,如果使用无参构造器,则初始化elementData容量为0,第一次添加,则扩容elementData为10,如需要再次扩容则扩容为1.5倍。
  3. 如果使用的是一个指定大小的构造器,则初始化elementData容量为指定大小,扩容为1.5倍(当前大小+当前大小/2)。

创建了一个空的elementData数组

执行list.add添加数据,确定是否需要扩容。

确定minCapacity(第一次扩容为10)

if判断elementData大小是否需要扩容

注意:idea在Debug是默认简化显示,需要完整显示则需要设置

        // grow扩容源码
        //使用扩容机制确定扩容,首次newCapacity=10,往后每次按1.5倍扩容
        //扩容使用的是Arrays.copyOf()
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);

断点2

创建了一个指定大小的elementData数组

 如果是有参数的构造器没扩容机制:

  1. 第一次扩容,按照elementData的1.5倍扩容。
  2. 执行流程同前。

本文作者:Dr丶云幕

本文链接:https://www.cnblogs.com/vayenge/p/18212850

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Dr丶云幕  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起