ArrayList

ArrayList

一、定义

1
2
3
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
...
}

有个地方没搞明白,按理说抽象类 AbstractList 已经包含了接口 List,为何还需要再次实现这个接口呢?

难道是担心抽象类 AbstractList 有可能会修改,不再实现接口 List

 ArrayDeque

ArrayDeque

一、定义

1
2
3
public class ArrayDeque<E> extends AbstractCollection<E> 
implements Deque<E>, Cloneable, Serializable {
}

ArrayDeque 实现了 Deque 接口,是一个数组实现的双向队列。

二、原理

2.1 数据结构

ArrayDeque 底层数据存储结构是数组:

 AbstractQueue

AbstractQueue

一、定义

1
2
3
4
5
public abstract class AbstractQueue<E>
extends AbstractCollection<E>
implements Queue<E> {

}

AbstractQueue 只是一个抽取类,其目的主要是为接口 Queue 的一些方法提供了基础的实现模板。

 AbstractSet

AbstractSet

一、定义

1
2
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> {
}

AbstractSet 提供了接口 Set 的模板实现,也就是提供了 Set 中某些方法的实现,减少实现 Set 接口时的代码。

二、实现

 AbstractMap

AbstractMap

一、定义

1
2
public abstract class AbstractMap<K,V> implements Map<K,V> {
}

AbstractMap 就是接口 Map 的模板实现类,提供一些已经实现好的方法,后续子类继承时就不用重复写了。

二、实现

2.1 entrySet

实际上,AbstractMap 里面的方法实现都是依赖 entrySet() 方法来实现的,具体看看代码吧:

 AbstractList

AbstractList

一、定义

AbstractList 是一个抽象类,是一个 List

1
2
3
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
...
}

二、属性

AbstractList 中,有一个特殊的属性 modCount,用于统计列表被修改的次数(例如删除、添加等)。

1
protected transient int modCount = 0;

modCount 属性的作用是为了在并发修改列表时,能够快速失败(fail-fast)并抛出并发异常。例如多个线程同时修改列表时,就有可能对正在访问列表元素的线程造成影响,modCount 属性可用于判断当前列表是否是异常状态。

 注解@Enumerated

@Enumerated

@Enumerated 是JDK中 javax.persistence 包下的注解,用在持久化实体类属性或字段上,表示该属性或字段应该按照枚举类型 Enum 来持久化。例如:

1
2
3
4
public enum Gender {
MALE,
FEMALE;
}
1
2
3
4
5
6
7
8
@Entity
public class Person {
@Column
@Enumerated
private Gender gender;

// 省略其他属性方法,后面也是
}

属性或字段按照枚举类型来持久化时,可以分为两种情况:原始类型和字符串类型。