其实 Java 集合框架也叫做容器,主要由两大接口派生而来,一个是 collection,主要存放对象的集合。另外一个是Map, 存储着键值对(两个对象)的映射表。
下面就来说说 List接口,List存储的元素是有序、可重复的。其下有三个子接口,ArrayList、LinkedList 和 vector。
一、 ArrayList概述ArrayList 底层数据结构是基于 Object 数组来实现的,我们看看它的底层接口源码:
1. ArrayList 实现的接口 public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable其中继承的接口中的 RandomAccess、Cloneable 和 Serializable 只是标记接口,他们的接口内部没有具体的方法和参数:
public interface RandomAccess {} public interface Cloneable {} //覆盖clone(),能被克隆 public interface Serializable {} //支持序列化,能通过序列化传输标记接口是计算机科学中的一种设计思路。编程语言本身不支持为类维护元数据。而标记接口则弥补了这个功能上的缺失——一个类实现某个没有任何方法的标记接口,实际上标记接口从某种意义上说就成为了这个类的元数据之一。运行时,通过编程语言的反射机制,我们就可以在代码里拿到这种元数据。
以Serializable接口为例。一个类实现了这个接口,说明它可以被序列化。因此,我们实际上通过Serializable这个接口,给该类标记了“可被序列化”的元数据,打上了“可被序列化”的标签。这也是标记/标签接口名字的由来。
此外AbstractList 继承AbstractCollection 抽象类,实现List接口。它实现了 List 的一些基本操作如(get,set,add,remove),是第一实现随机访问方法的集合类,但是不支持添加和替换。
2.ArrayList 的成员属性 private static final int DEFAULT_CAPACITY = 10; //默认初始容量为10 private static final Object[] EMPTY_ELEMENTDATA = {}; //空数组,用于空实例 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};//用于默认大小空实例的共享空数组实例。 transient Object[] elementData; //保存ArrayList数据的数组,transient修饰表示数组默认不会被序列化 private int size; //ArrayList中数组的个数 二、ArrayList 中的方法 Java ArrayList 中常用的方法: 方法 描述add() 将元素插入到指定位置的 arraylist 中
addAll() 添加集合中的所有元素到 arraylist 中
clear() 删除 arraylist 中的所有元素
clone() 复制一份 arraylist
contains() 判断元素是否在 arraylist
get() 通过索引值获取 arraylist 中的元素
indexOf() 返回 arraylist 中元素的索引值
removeAll() 删除存在于指定集合中的 arraylist 里的所有元素
remove() 删除 arraylist 里的单个元素
size() 返回 arraylist 里元素数量
isEmpty() 判断 arraylist 是否为空
subList() 截取部分 arraylist 的元素
set() 替换 arraylist 中指定索引的元素
sort() 对 arraylist 元素进行排序
toArray() 将 arraylist 转换为数组
toString() 将 arraylist 转换为字符串
ensureCapacity() 设置指定容量大小的 arraylist
lastIndexOf() 返回指定元素在 arraylist 中最后一次出现的位置
retainAll() 保留 arraylist 中在指定集合中也存在的那些元素
containsAll() 查看 arraylist 是否包含指定集合中的所有元素
trimToSize() 将 arraylist 中的容量调整为数组中的元素个数
removeRange() 删除 arraylist 中指定索引之间存在的元素
replaceAll() 将给定的操作内容替换掉数组中每一个元素
removeIf() 删除所有满足特定条件的 arraylist 元素
forEach() 遍历 arraylist 中每一个元素并执行特定操作
具体的方法细节可以看这里
三、ArrayList 中的扩容机制