ArrayList原理解析
前言
一、ArrayList结构概览
结构图 :
实现了三个标记接口:RandomAccess, Cloneable,Serializable
代码如下 :
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
关于标记接口的定义:
Java中的标记接口(Marker Interface),又称标签接口(Tag Interface),具体是不包含任何方法的接口。
二、结构说明
1. 接口
1.1 RandomAccess
/**
* Marker interface used by <tt>List</tt> implementations to indicate that
* they support fast (generally constant time) random access.
*/
public interface RandomAccess {
}
这段话大概的意思就是说 RandomAccess 是一个标志接口,表明实现这个接口的List 集合是支持快速随机访问的。
同时,官网还特意说明了,如果是实现了这个接口的 List,for循环获取数据是比迭代器获取数据更快的
As a rule of thumb, a List implementation should implement this interface if, for typical instances of the class, this loop:
for (int i=0, n=list.size(); i < n; i++)
list.get(i);
runs faster than this loop:
for (Iterator i=list.iterator(); i.hasNext(); )
i.next();
1.2 Cloneable
支持拷贝:实现Cloneable接口,重写clone方法、方法内容默认调用父类的clone方法。
1.2.1 浅拷贝
- 基础类型的变量拷贝之后是独立的,不会随着源变量变动而变
- String类型拷贝之后也是独立的
- 引用类型拷贝的是引用地址,拷贝前后的变量引用同一个堆中的对象
public static void main(String[] args) {
ArrayList<String> list = new ArrayList();
list.add("100");
list.add("200");
ArrayList<String> cloneList = (ArrayList<String>)list.clone();
cloneList.remove(0);
System.out.println(list);
System.out.println(cloneList)