文章目录
- 一、ArrayList特性
- 二、ArrayList底层数据结构
- 三、ArrayList继承关系
- 1、Serializable标记性接口
- 2、Cloneable标记性接口
- 3、RandomAccess标记性接口
- 4、AbstractList抽象接口
- 四、ArrayList源码分析
- 1、构造方法
- 2、添加方法
- 3、删除方法
- 4、修改方法
- 5、获取方法
- 6、转换方法
- 7、迭代器
- 8、清空方法
- 9、包含方法
- 五、面试题
- 1、ArrayList是如何扩容的?
- 2、ArrayList频繁扩容导致添加性能急剧下降,如何处理?
- 3、ArrayList插入或删除元素一定慢吗?
- 4、ArrayList是线程安全的吗?
- 5、如何复制某个ArrayList到另一个ArrayList中去?
- 6、已知成员变量集合存储N多用户名称,在多线程的环境下,使用迭代器在读取集合数据的同时如何保证可以正常写入数据到集合?
- 7、ArrayList和LinkList的区别
一、ArrayList特性
特性 | 描述 |
---|---|
是否允许为null | 允许 |
是否允许数据重复 | 允许 |
是否有序 | 有序 |
是否线程安全 | 非线程安全 |
二、ArrayList底层数据结构
底层的存储结构为数组,并且可以动态的调整数组的大小。
数组的特性:
- 增删慢:每次删除元素,都需要更改数组长度、拷贝以及移动元素位置。
- 查询快:由于数组在内存中是一块连续空间,因此可以根据地址 + 索引的方式快速获取对应位置上的元素。
三、ArrayList继承关系
1、Serializable标记性接口
类的序列化由实现java.io.Serializable接口的类启用。不实现此接口的类将不会使用任何状态序列化和反序列化。可序列化类的所有子类型都是可序列化的。序列化接口没有方法和字段,仅用于标识可串行化的语义。
- 序列化:将对象的数据写入到文件(写对象)。
- 反序列化:将文件中对象的数据读取出来(读对象)。
public interface Serializable {
}