ArrayList底层结构和源码分析(1)

最后

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
在这里插入图片描述

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取


  1. ArrayList基本了解:
  • ArrayList可以加入null,并且多个;

  • ArrayList是由数组来实现的;

  • ArrayList基本等同于Vector,除了ArrayList是线程不安全(执行效率高),在多线程情况下,不建议使用ArrrayList;

  1. Idea Debug设置

  2. Java -version 1.8.0_221

底层操作机制


  • ArrayList中维护了一个Object类型的elementData数组。

transient Object[] elementData; // transient 标识瞬间,短暂的,表示该属性不会被序列化

  • 当创建ArrayList对象时,如果使用的是无参构造器,则初始的elementData容量是0。第一次添加,则扩容elementData为10,如果需要再次扩容,则扩容elementData为原容量的1.5倍。

  • 如果使用指定大小的构造器,则初始elementData容量为指定大小。如果需要扩容,则扩容elementData为1.5倍。

解读源码


分析使用无参构造器,创建和使用ArrayList。有参构造器阅读源码过程差不多,不一样的是初次扩容

源程序

@SuppressWarnings(value = “all”)

public class ArrayListSource {

public static void main(String[] args) {

// 使用无参构造器创建ArrayList

ArrayList list = new ArrayList();

// 使用有参构造器创建ArrayList

// ArrayList list = new ArrayList(8);

// 向集合添加10条数据

for (int i = 1; i <= 10; i++) {

list.add(i);

}

// 再向集合添加5条数据

for (int i = 11; i <= 15; i++) {

list.add(i);

}

list.add(100);

list.add(200);

}

}

分析过程

1.创建一个空的数组【elementData】

image-20211112211822187

2.执行list.add(E e)

  • 先确保内部容量,是否要扩容ensureCapacityInternal

  • 然后再执行赋值

第一次添加的时候Debug F7 into进入源码!如果装填的数据是基本类型,塞入前会有一步装箱操作。

image-20211112212534426

3.确定最小容量【minCapacity】,第一次扩容为10

image-20211112213515703

4.确定是否需要扩容

  • modCount++ 记录集合被修改的次数

  • 如果elementData的大小不够,就调用grow()去扩容

image-20211112214100490

面试结束复盘查漏补缺

每次面试都是检验自己知识与技术实力的一次机会,面试结束后建议大家及时总结复盘,查漏补缺,然后有针对性地进行学习,既能提高下一场面试的成功概率,还能增加自己的技术知识栈储备,可谓是一举两得。

以下最新总结的阿里P6资深Java必考题范围和答案,包含最全MySQL、Redis、Java并发编程等等面试题和答案,用于参考~

重要的事说三遍,关注+关注+关注!

历经30天,说说我的支付宝4面+美团4面+拼多多四面,侥幸全获Offer

image.png

更多笔记分享

历经30天,说说我的支付宝4面+美团4面+拼多多四面,侥幸全获Offer

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

0-1715811659975)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值