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 有参分析

在这里插入图片描述

目录
相关文章
|
7月前
|
存储 安全 Java
【JDK 源码分析】ConcurrentHashMap 底层结构
【1月更文挑战第27天】【JDK 源码分析】ConcurrentHashMap 底层结构
|
存储 安全 Java
HashMap底层结构、扩容机制实战探索
HashMap底层结构、扩容机制实战探索
HashMap底层结构、扩容机制实战探索
|
6月前
|
Java
JavaSE——集合框架一(4/7)-List系列集合:LinkedList集合的底层原理、特有方法、队列、栈
JavaSE——集合框架一(4/7)-List系列集合:LinkedList集合的底层原理、特有方法、队列、栈
47 0
|
安全 Java
ArrayList底层实现原理
ArrayList底层实现原理
74 0
|
7月前
|
存储 Java
【JDK 源码分析】HashMap 底层结构
【1月更文挑战第27天】【JDK 源码分析】HashMap 底层结构
|
7月前
|
存储 Java 索引
深入学习Java集合之ArrayList的实现原理
深入学习Java集合之ArrayList的实现原理
59 0
|
存储 Cloud Native Linux
C++ list底层实现原理
C++ list底层实现原理
|
Java
认真研究Java集合之ArrayList的实现原理
认真研究Java集合之ArrayList的实现原理
46 0
|
存储 Java 索引
java集合框架List子接口之LinkedList源码剖析
LinkendList从物理结构来说是一种线性结构 , 而从逻辑结构来说是一种链式存储结构 , 虽然是线性结构 , 但是并不会按照线性的顺序存储 , 而是分散存储在内存中 , 通过指针来建立节点与节点之间的联系, 同时实现了Deque这也说明它是一个双向链表 , 在源码中 , 没有看到它对线程安全问题的处理 , 所以它同时还是一个线程不安全的链表 , 也没有看到不允许插入null元素 , 重复元素的处理 , 所以它又是一个允许重复元素以及null元素的链表
58 0
|
安全 Java
数据结构---ArrayList(Java实现)
从数据结构的角度看,List就是一个线性表,可以保存n个具有相同类型元素的有限序列,在该序列中,可以进行增删查改以及变量等操作
数据结构---ArrayList(Java实现)