一、List接口
List接口常用的实现类有3个 :
ArrayList
LinkedList
Vector
二、ArrayList
- 继承关系
,
ArrayList是继承AbstractList类,父类中对部分接口进行了实现;
ArrayList实现了List接口和Cloneable接口,以及Serializable,说明该类能够被克隆、序列化; - 特点:
通过JDK源码可以看出ArrayList底层数据结构为数组,数组的默认容量为10;
ArrayList也就具有与数组相同的特点:查询效率高,增删效率低且线程不安全;
ArrayList采用扩容的方式实现任意长度存储
,根据其存储的元素又有以下特点:
重复性:可以存储重复的元素;
null值:可以存储为值为null的元素;
有序性:能够保证数据的插入有序;
3、基本属性
private static final int DEFAULT_CAPACITY = 10; //默认容量大小
private static final Object[] EMPTY_ELEMENTDATA = {}; //默认数组
private transient Object[] elementData; //存储元素的数组
private int size; //集合存储元素的个数
- 构造函数
有参构造,指定集合初始化大小;
指定大小不合法,则直接抛出异常;
参数合法则会数组进行初始化;
5.无参构造,使用默认数组;
通过集合来创建新的集合
ArrayList常用方法:
int size(); //集合中存储元素的个数
boolean isEmpty(); //判断当前集合是否为空,返回值为boolean类型
boolean contains(Object o); //判断当前集合是否包含Object对象
Iterator<E> iterator(); //迭代器,返回iterator实例
Object[] toArray(); //将集合转化为数组
<T> T[] toArray(T[] a); //将集合转化为数组
boolean add(E e); //添加元素
boolean remove(Object o); //删除元素
boolean containsAll(Collection<?> c); //判断入参集合是否属于当前集合
boolean addAll(Collection<? extends E> c); //对该集合添加子集合形成新的集合
boolean addAll(int index,Collection<? extends E> c); //在指定的位置添加子集合
void clear(); //将集合置为空
boolean equals(Object o); //判断是否相等
E get(int index); //通过指定位置来获取index位置上的元素
int indexOf(Object o); //判断当前元素在集合中的位置(从前往后查找)
int lastIndexOf(Object o); //判断当前元素在集合中的位置(从后往前查找)
List<E> subList(int fromIndex,int toIndex); //查找当前集合的子集,左闭右开 [ )
6、增长方式
在源码中可以看到,在需要添加元素时,若size+1大于数组的容量,ArrayList将按照原数组的1.5倍进行扩容
7.ArrayList和数组的不同点
初始化大小:ArrayList可以不指定大小,数组必须指定大小;
ArrayList只能存储引用类型,数组可以存储引用类型和基本类型
ArrayList封装了很多方法,用法比数组灵活