设为首页 加入收藏

TOP

Java集合类:AbstractCollection源码解析(一)
2018-01-01 06:07:01 】 浏览:461
Tags:Java 集合 AbstractCollection 源码 解析

一、Collection接口


  


总体上可以将Collection的方法分为以下几大类:


1、增加(add/addAll)


2、删除(remove/removeAll/clear/retainAll)


3、查询(contain/containAll/iterator/size/isEmpty)


4、转数组(toArray/toArray(T[]))


  直接实现该接口的类只有AbstractCollection类,该类也只是一个抽象类,提供了对集合类操作的一些基本实现。List和Set的具体实现类基本上都直接或间接的继承了该类。为了方便以后更清晰的理解这些类的实现,我们先看下AbstractCollection的实现。


二、AbstractCollection源码解析


package java.util;
 
public abstract class AbstractCollection<E> implements Collection<E> {
 
    protected AbstractCollection() {
    }
 
    public abstract Iterator<E> iterator();
 
    public abstract int size();
 
    //判断集合中是否有数据
    public boolean isEmpty() {
        return size() == 0;
    }
 
    /**
    * 判断是否包含指定的元素
    * (1)如果参数为null,查找值为null的元素,如果存在,返回true,否则返回false。
    * (2)如果参数不为null,则根据equals方法查找与参数相等的元素,如果存在,则返回true,否则返回false。
    * 注意:这里必须对null单独处理,否则null.equals会报空指针异常
    */
    public boolean contains(Object o) {
        Iterator<E> it = iterator();
        if (o==null) {
            while (it.hasNext())
                if (it.next()==null)
                    return true;
        } else {
            while (it.hasNext())
                if (o.equals(it.next()))
                    return true;
        }
        return false;
    }
 
    /**
    * 功能:将集合元素转换为数组
    * 实现:
    * (1)创建一个数组,大小为集合中元素的数量
    * (2)通过迭代器遍历集合,将当前集合中的元素复制到数组中(复制引用)
    * (3)如果集合中元素比预期的少,则调用Arrays.copyOf()方法将数组的元素复制到新数组中,并返回新数组,Arrays.copyOf的源码在后续文章中会分析.
    * (4)如果集合中元素比预期的多,则调用finishToArray方法生成新数组,并返回新数组,否则返回(1)中创建的数组
    */
    public Object[] toArray() {
        Object[] r = new Object[size()];
        Iterator<E> it = iterator();
        for (int i = 0; i < r.length; i++) {
            if (! it.hasNext()) // fewer elements than expected
                return Arrays.copyOf(r, i);
            r[i] = it.next();
        }
        return it.hasNext() ? finishToArray(r, it) : r;
    }
 
    /**
    * 功能:通过泛型约束返回指定类型的数组
    * 实现:
    * (1)如果传入数组的长度的长度大于等于集合的长度,则将当前集合的元素复制到传入的数组中
    * (2)如果传入数组的长度小于集合的大小,则将创建一个新的数组来进行集合元素的存储
    */
    public <T> T[] toArray(T[] a) {
        // Estimate size of array; be prepared to see more or fewer elements
        int size = size();
        T[] r = a.length >= size ? a :
                  (T[])java.lang.reflect.Array
                  .newInstance(a.getClass().getComponentType(), size);
&nb

首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇在Andoid中如何使用RxJava 2进行.. 下一篇Java8函数式编程实践精华

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目