栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

ArrayList 源码 + 扩容机制分析

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

ArrayList 源码 + 扩容机制分析

1. ArrayList 简介

ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增长。在添加大量元素前,我们可以使用 ensureCapacity() 方法来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。

ArrayList继承于 AbstractList ,实现了 List, RandomAccess, Cloneable, java.io.Serializable 这些接口。

public class ArrayList extends AbstractList
    implements List, RandomAccess, Cloneable, java.io.Serializable{

}
  • RandomAccess 是一个标志接口,表明实现这个这个接口的 List 集合是支持快速随机访问的。在 ArrayList 中,我们即可以通过元素的索引快速获取元素对象,这就是快速随机访问。
  • ArrayList 实现了 Cloneable 接口,即覆盖了函数clone(),能被克隆。
  • ArrayList 实现了 java.io.Serializable接口,这意味着ArrayList支持序列化,能通过序列化去传输。
2、ArrayList 扩容机制分析 2.1 变量分析
// 序列化 ID
private static final long serialVersionUID = 8683452581122892189L;

// 默认初始容量大小
private static final int DEFAULT_CAPACITY = 10;

// 空数组,用于空实例
private static final Object[] EMPTY_ELEMENTDATA = {};

// 用于默认大小空实例的共享空数组实例。
// 我们把它从 EMPTY_ELEMENTDATA 数组中区分出来,以知道在添加第一个元素时容量需要增加多少
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

// 保存数据的数组,所以说 ArrayList 的底层是数组,只不过能动态增长而已
transient Object[] elementData;

// 元素个数
private int size;

思考:transient Object[] elementData; 为啥要用 transient 关键字修饰?

答:我们知道用 transient 修饰的变量不会被序列化,这不就意味着序列化时,我们的数据丢失了吗?阅读其源码发现,ArrayList 提供了 writeObject() 和 readObject() 这两个方法,在进行序列化和反序列化时会调用这两个方法进行相关操作,不会造成数据丢失。
深入了解序列化writeObject、readObject、readResolve

// 进行序列化时会自动调用的方法
private void writeObject(java.io.ObjectOutputStream s)
    throws java.io.IOException{
    // Write out element count, and any hidden stuff
    int expectedModCount = modCount;
    s.defaultWriteObject();

    // Write out size as capacity for behavioural compatibility with clone()
    // 把元素个数写入到流中
    s.writeInt(size);

    // Write out all elements in the proper order.
    for (int i=0; i
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/601008.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号