• 集合—ArrayList底层结构和源码分析


    本次博客带领大家学习集合中的ArrayList底层结构和源码分析。

    ArrayList的底层结构

    1. permits all elements,including null , ArrayList 可以加入null,并且可以加入多个。
    2. ArrayList 是由数组来实现数据存储的。
    3. ArrayList 基本等同于Vector,除了ArrayList是线程不安全(执行效率高),在多线程情况下,不建议使用ArrayList。
    public class ArraryDetail {
        public static void main(String[] args) {
            ArrayList arrayList = new ArrayList();
            arrayList.add(null);
            arrayList.add("jack");
            System.out.println(arrayList);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    ArrayList的底层操作机制源码分析

    1. ArrayList中维护了一个Object类型的数组elementData。
    2. 当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData容量为0,第1次添加,则扩容elementData为10,如需要再次扩容,则扩容elementData为1.5倍。
    3. 如果使用的是指定大小的构造器,则初始化elementData容量为指定大小,如果需要扩容,则直接扩容elementData为1.5倍。

    无参构造器源码分析

    • 创建一个空的elementData数组={}
      请添加图片描述

    • 执行list.add

      1. 先确定是否要扩容
      2. 然后再执行赋值
        请添加图片描述
    • 该方法确定minCapacity

      1. 第一次扩容为10
        请添加图片描述
    1. modCount++ 记录集合被修改的次数
    2. 如果elementData的大小不够,就调用grow()去扩容
      请添加图片描述
    3. 真的扩容
    4. 使用扩容机制来确定要扩容到多大
    5. 第一次newCapacity=10
    6. 第二次及其以后,按照1.5倍扩容
    7. 扩容使用的是Arrays.copyOf(),保护之前的数据
      请添加图片描述

    有参构造器源码分析

    • 创建了一个指定大小elementData数组this.elementData = new Object[capacity]
      请添加图片描述
    • 下面的步骤与无参构造一致。
    • 但与无参的区别是第一次扩容是按照elementData的1.5倍扩容。

    案例代码:

    public class ArrayListSource {
        public static void main(String[] args) {
            //使用无参构造器创建ArrayList对象
            //ArrayList list = new ArrayList();
            ArrayList list = new ArrayList(8);
    
            //使用for给list集合添加 1-10数据
            for (int i = 1; i <= 10; i++) {
                list.add(i);
            }
            //使用for给list集合添加 11-15数据
            for (int i = 11; i<=15 ;i++){
                list.add(i);
            }
            list.add(100);
            list.add(300);
            list.add(null);
        }
    }
         }
            list.add(100);
            list.add(300);
            list.add(null);
        }
    }
    
    • 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
  • 相关阅读:
    安装配置MySQL
    VoLTE基础自学系列 | VoLTE实战分析之VoLTE注册流程
    深入理解 Django 信号机制
    Socket通信原理
    NodeJs-http模块
    813. 最大平均值和的分组-动态规划算法
    java高级用法之:在JNA中将本地方法映射到JAVA代码中
    倒计时2天,“文化数字化战略新型基础设施暨文化艺术链生态建设发布会”启幕在即
    【c语言基础题】— —第六版,可当作日常练习和期末复习,有奇效哟!
    (附源码)ssm在线点餐系统 毕业设计 111016
  • 原文地址:https://blog.csdn.net/lidong777777/article/details/126011930