ArrayList底层结构和源码分析

简介: ArrayList底层结构和源码分析

1. ArrayList 的注意事项

1) permits all elements, including null , ArrayList可以加入null,并且多个。

    ArrayList arrayList = new ArrayList();
    arrayList.add(null);
    arrayList.add("兮动人");
    arrayList.add(null);
    System.out.println(arrayList);

在这里插入图片描述

2) ArrayList是由 数组 来实现数据存储的
3) ArrayList基本等同于Vector,除了ArrayList线程不安全(执行效率高)
看源码,如 :add 方法没有 synchronized (同步)修饰。
多线程情况下,不建议使用ArrayList。

public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
}

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

1) ArrayList中维护了一个Object类型的数组elementData。[debug看源码]
transient Object[] elementData;transient表示瞬间,短暂的,表示该属性不会被序列化
在这里插入图片描述

2) 当创建ArrayList对象时,如果使用的是无参构造器,则初始值elementData容量为0,第1次 添加,则扩容elementData10,如需要再次扩容,则扩容elementData1.5倍。
在这里插入图片描述

  • 无参构造器-扩容

在这里插入图片描述
在这里插入图片描述

3) 如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容,则直接扩容elementData1.5倍。

  • 指定大小的构造器--扩容

在这里插入图片描述
在这里插入图片描述

  • 建议:去debug一把我们的ArrayList的创建和扩容的流程。
  1. debug 查看 ArrayList 源码分析
    //使用无参构造器创建 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(200);
    list.add(null);
  • 注意:Idea 默认情况下,Debug 显示的数据是简化后的,如果希望看到完整的数据,需要设置如下

在这里插入图片描述

  • ArrayList 无参构造分析:
  • 可以看到 ArrayList 第一次初始化后的 elementData 是个空数组

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • ArrayList 有参分析

在这里插入图片描述

目录
相关文章
|
8月前
|
存储 安全 Java
【JDK 源码分析】ConcurrentHashMap 底层结构
【1月更文挑战第27天】【JDK 源码分析】ConcurrentHashMap 底层结构
|
3月前
|
存储 算法 Java
Java HashSet:底层工作原理与实现机制
本文介绍了Java中HashSet的工作原理,包括其基于HashMap实现的底层机制。通过示例代码展示了HashSet如何添加元素,并解析了add方法的具体过程,包括计算hash值、处理碰撞及扩容机制。
|
安全 Java
ArrayList底层实现原理
ArrayList底层实现原理
79 0
|
8月前
|
存储 Java
【JDK 源码分析】HashMap 底层结构
【1月更文挑战第27天】【JDK 源码分析】HashMap 底层结构
|
存储 Cloud Native Linux
C++ list底层实现原理
C++ list底层实现原理
|
XML 存储 JSON
java框架集合List子接口之ArrayList源码剖析
ArrayList使用尾删法时 , 时间复杂度为O(1) , 并且会把最后一个元素置位null , 其它删除时间复杂度为O(N) , 因为会涉及到元素的移动以及元素的遍历 ArrsyList是线程不安全的
42 0
|
存储 Java 索引
java集合框架List子接口之LinkedList源码剖析
LinkendList从物理结构来说是一种线性结构 , 而从逻辑结构来说是一种链式存储结构 , 虽然是线性结构 , 但是并不会按照线性的顺序存储 , 而是分散存储在内存中 , 通过指针来建立节点与节点之间的联系, 同时实现了Deque这也说明它是一个双向链表 , 在源码中 , 没有看到它对线程安全问题的处理 , 所以它同时还是一个线程不安全的链表 , 也没有看到不允许插入null元素 , 重复元素的处理 , 所以它又是一个允许重复元素以及null元素的链表
61 0
|
存储 算法
【HashMap底层运行原理】
【HashMap底层运行原理】
|
安全 算法
Vector底层结构和源码分析
Vector底层结构和源码分析
122 0
Vector底层结构和源码分析
|
Java
关于Java面试中的ArrayList底层结构、底层源码的高频热点面试题解析
关于Java面试中的ArrayList底层结构、底层源码的高频热点面试题解析
132 0