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

在这里插入图片描述

目录
相关文章
|
6月前
|
存储 安全 Java
【JDK 源码分析】ConcurrentHashMap 底层结构
【1月更文挑战第27天】【JDK 源码分析】ConcurrentHashMap 底层结构
|
20天前
|
存储 算法 Java
Java HashSet:底层工作原理与实现机制
本文介绍了Java中HashSet的工作原理,包括其基于HashMap实现的底层机制。通过示例代码展示了HashSet如何添加元素,并解析了add方法的具体过程,包括计算hash值、处理碰撞及扩容机制。
|
3月前
|
存储 算法 Java
【Java集合类面试八】、 介绍一下HashMap底层的实现原理
HashMap基于hash算法,通过put和get方法存储和获取对象,自动调整容量,并在碰撞时用链表或红黑树组织元素以优化性能。
|
15天前
|
存储 Java 开发者
Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效
【10月更文挑战第19天】在软件开发中,随着项目复杂度的增加,数据结构的组织和管理变得至关重要。Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效。本文通过在线购物平台的案例,展示了Map在商品管理、用户管理和订单管理中的具体应用,帮助开发者告别混乱,提升代码质量。
24 1
|
存储 安全 Java
HashMap底层结构、扩容机制实战探索
HashMap底层结构、扩容机制实战探索
HashMap底层结构、扩容机制实战探索
|
安全 Java
ArrayList底层实现原理
ArrayList底层实现原理
72 0
|
6月前
|
存储 Java
【JDK 源码分析】HashMap 底层结构
【1月更文挑战第27天】【JDK 源码分析】HashMap 底层结构
|
存储 Cloud Native Linux
C++ list底层实现原理
C++ list底层实现原理
|
存储 Java 索引
java集合框架List子接口之LinkedList源码剖析
LinkendList从物理结构来说是一种线性结构 , 而从逻辑结构来说是一种链式存储结构 , 虽然是线性结构 , 但是并不会按照线性的顺序存储 , 而是分散存储在内存中 , 通过指针来建立节点与节点之间的联系, 同时实现了Deque这也说明它是一个双向链表 , 在源码中 , 没有看到它对线程安全问题的处理 , 所以它同时还是一个线程不安全的链表 , 也没有看到不允许插入null元素 , 重复元素的处理 , 所以它又是一个允许重复元素以及null元素的链表
54 0
|
安全 Java
数据结构---ArrayList(Java实现)
从数据结构的角度看,List就是一个线性表,可以保存n个具有相同类型元素的有限序列,在该序列中,可以进行增删查改以及变量等操作
数据结构---ArrayList(Java实现)