一、ArrayList简介:
1.1ArrayList 概述
1)ArrayList是是一个可以动态修改的数组,它是基于数组实现的List接口。
2)ArrayList类喂鱼java.util包中,使用前需要引入,语法格式如下:
import java.util.ArrayList;//引入ArrayList类
ArrayList<E> objectName = new ArrayList<>();//初始化
3)ArrayList和Vector的区别:
ArrayList是线程不安全的,当多条线程同时访问同一个ArrayList集合时,程序需要手动保证该集合的同步性,而Vector则是线程安全的。
4)ArrayList是一个数组队列,提供了相关的添加、删除、修改、遍历等功能。
二、ArrayList的数据结构:
分析一个类的时候,数据结构往往是灵魂所在,ArrayList的数据结构是:
底层的数据结构是数组,数组元素类型为Object类型,即可以存放所有的类型数据。所有的操作都是基于数组的。
三、ArrayList继承结构和层次关系:
ArrayList extends AbstractList
AbstractList extends AbstractCollection
所有的类都继承Object
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{}
分析:
1、为什吗要先继承AbstractList,而让AbstractList 先实现List? 而不是让ArrayList直接实现List?
A:接口中全都是抽象的方法,而抽象类中可以有抽象方法,还可以有具体的实现方法,正是利用这一点,让AbstractList实现接口中的一些普通的方法;
B:具体的类,如ArrayList就继承这个AbstractList类,拿到一些通用的方法,然后自己再实现一些自己的特有方法,这样子让代码更简洁,就继承结构最低成的类中通用的方法都抽取出来。
C: 先一起实现了,减少代码重复, 一般看到一个类上面还有一个抽象类,大部分都是在这个作用。
2、ArrayList实现了那些接口?
1)RandomAccess接口:这是一个标记性接口,用来跨苏随机存取,有关效率的问题,在实现了该接口的话,使用普通的for循环遍历,性能更高。
而没有实现该接口的话,使用Iterator来迭代,这样性能更高,例如linkedList。所以这个标记性只是为了让我们知道我们用什么样的方式去获取数据性能更好。
2)Cloneable接口:实现了该接口就可以使用Object.Clone()方法了。
3)Serializable接口:实现该序列化接口,表明该类可以被序列化。
序列化:简单的说就是能够从类变成字节流传输,然后还能从字节流变成原来的类。
四、ArrayList类中的属性:
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneble, java.io.Serializable{
//版本号
private static final long serialVersionUID = 8683452581122892189L;
//缺省属性
private static final int DEFAULT_CAPACITY = 10;
//空对象数组
private static final Object[] EMPTY_ELEMENTDATA = {};
//缺省空对象数组
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
//元素数组
transient Object[] elementData;
//实际元素大小 默认为0
praivate int size;
//最打数组容量
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE -8;
}