一、Collection接口及其常见实现子类、子接口
由上图可以看出,Collection 接口实现了 Iterable 接口;
Iterable接口是Java集合类中的核心接口之一,实现该接口的类具有迭代功能,它提供了能够对实现它的子类 中的元素进行逐个遍历的方式,iterator()方法和 foreach() 方法
Collection接口包含了大部分容器常用的一些方法,实现该接口的集合为单列集合,其实现子接口主要包括 List 接口和 Set 接口
1. List 接口
实现该接口的类的特征为:有序的,可重复的集合;此处的有序是指插入的顺序和遍历得到的结果的顺序是相对应的。
其常用方法如下(接口中的方法没有方法体,所以这些方法是留给子类实现的):
下面介绍 List 接口的常见实现子类
1)ArrayList
底层数据结构:动态类型顺序表(可以动态扩容的连续空间);
类声明解读:
1. ArrayList 是以泛型方式实现的,使用时必须要先实例化
2. ArrayList 实现了 RandomAccess 接口,表明 ArrayList 支持随机访问
3. ArrayList 实现了 Cloneable 接口,表明 ArrayList 是可以 clone 的
4. ArrayList 实现了 Serializable 接口,表明 ArrayList 是支持序列化的
5. 和 Vector 不同,ArrayList 不是线程安全的,在单线程下可以使用,在多线程中可以选择 Vector 或者 CopyOnWriteArrayList
常用构造方法:
ArrayList():默认无参构造方法,用来创建一个空的ArrayList对象,初始容量为10。
ArrayList(int initialCapacity):创建一个空的ArrayList对象,指定初始容量。
ArrayList(Collection<? extends E> c):创建一个包含指定集合元素的ArrayList对象。例如:
public static void main(String[] args) {
Set<Integer> set = new HashSet<>();
set.add(1);
set.add(2);
List<Integer> list = new ArrayList<>(set);
System.out.println(list);
}
其他常用方法和 List 接口的常用方法一致;
ArrayList 扩容机制:在插入的时候自动扩容:首先在插入的时候会检查是否需要扩容,如果需要扩容,则初步预估按照 1.5 倍大小扩容,如果用户所需大小超过预估 1.5 倍大小,则按照用户所需大小扩容,真正扩容之前检测是否能扩容成功,防止太大导致扩容失败,最后使用 Arrays.copeOf方法进行扩容;
2)LinkedList
底层数据结构:双向链表
常用构造方法:
LinkedList():默认无参构造,创建一个空的LinkedList对象。
LinkedList(Collection<? extends E> c):创建一个包含指定集合中所有元素的LinkedList对象。
其他常用方法:
LinkedList 当做链表使用时,此时对应的方法与 List 一致;
也可以当做栈来使用时,此时对应的方法为:
也可以当做队列来使用,此时对应的方法为: