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

在这里插入图片描述

目录
相关文章
|
编解码 监控 API
直播源怎么调用api接口
调用直播源的API接口涉及开通服务、添加域名、获取API密钥、调用API接口、生成推流和拉流地址、配置直播源、开始直播、监控管理及停止直播等步骤。不同云服务平台的具体操作略有差异,但整体流程简单易懂。
|
9月前
|
消息中间件 安全 Java
VCTGO:一款让开发者直呼“真香”的企业级快速开发平台,你绝对不能错过!
嗨,大家好,我是小华同学。关注我们获取“最新、最全、最优质”的开源项目和高效工作学习方法。今天为大家介绍一款企业级快速开发平台——VCTGO。基于Spring Boot + Vue.js,VCTGO提供用户管理、菜单管理、角色管理、日志管理、代码生成、系统监控等核心功能,支持从开发到部署的一站式解决方案。技术架构采用主流技术栈,包括前端Vue.js + Element UI,后端Spring Boot + MyBatis Plus,数据库MySQL,缓存Redis,消息队列RabbitMQ,
236 27
|
测试技术
单元测试问题之在单元测试中,方法的返回值或异常,如何验证
单元测试问题之在单元测试中,方法的返回值或异常,如何验证
|
SQL 安全 JavaScript
告别Web安全小白!Python实战指南:抵御SQL注入、XSS、CSRF的秘密武器!
【9月更文挑战第12天】在Web开发中,安全漏洞如同暗礁,尤其对初学者而言,SQL注入、跨站脚本(XSS)和跨站请求伪造(CSRF)是常见挑战。本文通过实战案例,展示如何利用Python应对这些威胁。首先,通过参数化查询防止SQL注入;其次,借助Jinja2模板引擎自动转义机制抵御XSS攻击;最后,使用Flask-WTF库生成和验证CSRF令牌,确保转账功能安全。掌握这些技巧,助你构建更安全的Web应用。
229 5
|
文字识别
【提取翻译竖排文字日文图片的软件】竖排的日语图片文字识别翻译,竖排的日语图片文字如何识别,竖排日语图片识别后转横排,竖排的日语识别比较友好的方法
这款软件专攻竖排日语图片文字识别,支持自动横排转换,能准确提取左右排版文字,并翻译成中文。用户可从百度网盘或腾讯云盘下载。功能包括图片打开、拖拽识别、截屏拾取、顺序识别、文字导出、快捷搜索及窗体操作。识别时注意保持文字等高以减少误差。附带视频教程(BV1vW4y1p7st)帮助快速上手。
2421 1
|
存储 关系型数据库 MySQL
MySQL中使用UUID做主键时需要注意的两个坑(译文)
在InnoDB中使用UUID作为主键需要考虑两个问题
574 0
|
负载均衡 Kubernetes 网络协议
kubernetes--kube-proxy组件深入理解
每台机器上都运行一个kube-proxy服务’它监听API server中service和endpoint的变化情 况,并通过iptables等来为服务配置负载均衡(仅支持TCP和UDP)
694 0
|
机器学习/深度学习 算法
基于RBF神经网络的自适应控制器simulink建模与仿真
使用MATLAB2022a,开发了一个基于RBF神经网络的自适应控制器Simulink S函数,进行了控制仿真。核心程序展示了RBF网络的权重和参数调整。测试结果显示了控制效果。RBF网络是一种三层前馈网络,利用高斯函数处理非线性系统。自适应控制器通过在线调整参数应对系统变化。网络学习分为自组织和有导师两个阶段,通过误差信号调整权重,确保系统稳定性。
|
C++ 开发者 Unix
面向 C++ 的现代 CMake 教程(四)(5)
面向 C++ 的现代 CMake 教程(四)
204 0
|
存储 缓存 物联网
MQTT常见问题之MQTT发送消息过多内存不够处理不过来如何解决
MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总:
下一篇
开通oss服务