JavaSE基础知识(二十一)--Java集合(容器)之抽象类AbstractCollection的源码分析

本文详细分析了Java集合框架中AbstractCollection抽象类的构造方法、重要变量和主要方法,包括add、remove、iterator、size等。讲解了如何基于AbstractCollection实现不可修改和可修改的集合类,以及对Collection接口规范的遵循和API文档的说明。内容涵盖构造方法、无参数构造器、方法重写和集合操作的实现原理。
摘要由CSDN通过智能技术生成

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类源码文档解释
上面的英文注释分别阐述了以下内容(上面英文注释的一个段落用一个小标):
⑴、抽象类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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值