Java SE 是什么,包括哪些内容(二十一)?
本文内容参考自Java8标准
再次感谢Java编程思想对本文的启发!
在详细了解了集合框架的根接口Collection前提下,才能更好地理解集合框架中另一个非常重要的承上启下的抽象类:
AbstractCollection
接口Collection方法与抽象类AbstracCollection方法对比
其中加粗表示提供了实现,–表示当前接口/类中不存在这个方法。
Collection | AbstractCollection |
---|---|
size() | size() |
isempty() | isEmpty() |
contains(Object o) | contains(Object o) |
iterator() | iterator() |
toArray() | toArray() |
toArray(T[] a) | toArray(T[] a) |
add(E e) | add(E e) |
remove(Object o) | remove(Object o) |
containsAll(Collection<?> c) | containsAll(Collection<?> c) |
addAll(Collection<? extends E> c) | addAll(Collection<? extends E> c) |
removeAll(Collection<?> c) | removeAll(Collection<?> c) |
removeIf(Predicate<? super E> filter) | – |
retainAll(Collection<?> c) | retainAll(Collection<?> c) |
clear() | clear() |
equals(Object o) | – |
hashCode() | – |
spliterator() | – |
stream() | – |
parallelStream() | – |
– | finishToArray(T[] r, Iterator<?> it) |
– | hugeCapacity(int minCapacity) |
– | toString() |
它的类声明是:
//抽象类implements接口Collection<E>
public abstract class AbstractCollection<E> implements Collection<E>
源代码图示(英文注释看不懂不要紧,图下面会有普通话解释):
上面的英文注释分别阐述了以下内容(上面英文注释的一个段落用一个小标):
⑴、抽象类AbstractCollection提供了接口Collection的基本实现。
⑵、有以下四个方法需要注意:
①、方法add(E e)仅仅抛出了一个异常,没有添加元素的具体实现:
②、方法remove(Object o)虽然提供了部分实现,但是在删除元素的时候,它使用的是迭代器类提供的删除方法:
③、方法iterator()是一个抽象方法,没有任何的实现。
④、方法size()是一个抽象方法,没有任何的实现:
所以,如果想实现一个不可修改的集合类,你需要做以下四件事情:
①、继承抽象类AbstractCollection并提供add(E e)方法的实现,保证当前集合类不能添加元素。
②、继承抽象类AbstractCollection并提供remove(Object o)方法的实现,保证当前集合类不能删除元素。
③、因为删除元素涉及到迭代器类的删除方法,所以还需要创建一个类implements接口Iterator,并提供整个类的实现(包括方法remove(Object o),方法hasNext()和方法next()等)。
④、继承抽象类AbstractCollection并提供size()方法的实现,保证它始终返回一个恒定不变的值。
⑶、如果想实现一个可修改的集合类,参照⑵:
①、继承抽象类AbstractCollection并提供add(E e)方法的实现,根据当前集合类的数据结构来添加元素(数据结构有数组、链表、栈、队列等等)。
②、继承抽象类AbstractCollection并提供remove(Object o)方法的实现,根据当前集合类的数据结构来删除元素(数据结构有数组、链表、栈、队列等等)。
③、因为删除元素涉及到迭代器类的删除方法,所以还需要创建一个类implements接口Iterator,并提供整个类的实现(包括方法remove(Object o),方法hasNext()和方法next()等)。
④、继承抽象类AbstractCollection并提供size()方法的实现,保证它始终返回当前集合对象存储的元素个数。
⑷、根据Collection接口规范中的建议,每个集合类都应该提供一个无参数的构造方法。
⑸、官方的API文档对抽象类AbstractCollection中的每个非抽象方法的实现都进行了详细的描述。 如果某个继承了抽象类AbstractCollection的子类需要对其中的某个方法提供其它实现,可以直接覆盖(方法重写)。
⑹、抽象类AbstractCollection是Java Collections Framework中的重要一员。
下面具体来看抽象类AbstractCollection有哪些内容,为接口Collection的哪些方法提供了实现。
构造方法:
1、构造方法一:
//protected修饰表示仅提供给子类继承使用,不对外公开
//它是抽象类AbstractCollection唯一的构造方法
protected AbstractCollection() {
}
变量:
//int类型的最大值就是Integer.MAX_VALUE
//所以它表示可分配的最大数组大小
//初始化为Integer.MAX_VALUE-8.官方解释是某些操作系统
//需要预留部分空间给创建数组时产生的额外开销
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
普通方法:
1、iterator():
//关键字abstract说明它是一个抽象方法,需要子类提供实现
//返回符合当前集合类数据结构的迭代器对象
public abstract Iterator<E> iterator();
2、size():
//关键字abstract说明它是一个抽象方法,需要子类提供实现
//返回当前集合对象存储的元素个数
public abstract int size();
2、isEmpty():
//判断当前集合对象是否存储了元素
public boolean isEmpty() {
//方法size()返回的就是当前集合对象存储的元素个数
//如果size() == 0就表示没有元素
return size() == 0;
}
3、contains(Object o):
//判断当前集合对象中是否包含指定元素o(只判断有没有,与数量无关)
public boolean contains(Object o) {
//返回适合当前集合对象数据结构的迭代器对象
Iterator<E> it = iterator();
//区分指定对象o==null和o!=null的情况
//如果o == null
if (o==null) {
//遍历整个集合对象
//it.hasNext()判断是否还有下一个元素
while (it.hasNext())
//it.next()获取迭代器游标指向的元素
//如果某个元素为null
if (it.next()==null)
//立即结束程序并返回true
return true;
//如果o!=null
} else {
while (it.hasNext())
//如果迭代器游标指向的元素(it.next())与指定元素o
//完全相等(这里使用方法equals(Object o)判断两个元素是否相等
//不是"=="),如果想修改元素相等的规则
//可以重写equals(Object o)方法
if (o.equals