ArrayList底层结构和源码分析

本文深入探讨了ArrayList的特性,指出其线程不安全,适合单线程环境使用。同时,详细解析了ArrayList的扩容机制,初始容量为0时,首次添加元素会扩容到10,之后每次按1.5倍扩容。若初始化指定容量,则后续扩容仍按1.5倍进行。通过示例代码展示了ArrayList的添加过程,包括添加数值和null元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ArrayList注意事项

ArrayListDetail.java

  1. permits all elements, including null ,ArrayList 可以加入null,并且多个;
  2. ArrayList是由数组来实现数据存储的;
  3. ArrayList 基本等同于Vector,除了 ArrayList是线程不安全(执行效率高)看源码.,在多线程情况下,不建议使用ArrayList
package com.List_;

import java.util.ArrayList;

/**
 * @author pengyang
 * @date 2022-06-07 14:21
 */

public class ArrayListDetail {
    public static void main(String[] args) {
        ArrayList arrayList = new ArrayList();

        //ArrayList是线程不安全的,在源码中可以看到,没有synchronized
//        public boolean add(E e) {
//            ensureCapacityInternal(size + 1);  // Increments modCount!!
//            elementData[size++] = e;
//            return true;
//        }
    }
}

ArrayList扩容机制

ArrayList的底层操作机制源码分析(重点,难点.)ArrayListSource.java ,先说结论,在分析源码(示意图)

  1. ArrayList中维护了一个Object类型的数组elementData.[debug看源码]
    transient Object[] elementData; //transient表示瞬间,短暂的,表示该属性不会被序列化

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

  3. 如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容,则直接扩容elementData为1.5倍。
    在这里插入图片描述
    源码debug

package com.Collection_.List_;

import java.util.ArrayList;

/**
 * @author pengyang
 * @date 2022-06-07 14:48
 */

public class ArrayListSource {
    public static void main(String[] args) {

        //使用无参构造器创建ArrayList
        //ArrayList list = new ArrayList();
        ArrayList list = new ArrayList(8);

        for (int i = 0; i <= 10; i++) {
            list.add(i);
        }

        for (int i = 11; i <= 15; i++) {
            list.add(i);
        }

        list.add(100);
        list.add(200);
        list.add(null);

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值