AbstractCollection
概述
这个类提供了实现Collection接口的骨架,来最小化实现此接口所做的工作。
要实现一个不可修改的 collection,编程人员只需扩展此类,并提供 iterator 和 size 方法的实现。(iterator 方法返回的迭代器必须实现 hasNext 和 next。)
要实现可修改的 collection,编程人员必须另外重写此类的 add 方法(否则,会抛出 UnsupportedOperationException),iterator 方法返回的迭代器还必须另外实现其 remove 方法。
无参构造器
    protected AbstractCollection() {
    }
抽象方法
    public abstract Iterator<E> iterator();
    public abstract int size();
字段
数组能容纳的最大元素个数
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
其他方法比较简单,我们看几个比较有意思的方法
System.arraycopy () 本地方法 如果是数组比较大,那么使用System.arraycopy会比较有优势,因为其使用的是内存复制,省去了大量的数组寻址访问等时间
* @param src the source array.
* @param srcPos starting position in the source array.
* @param dest the destination array.
* @param destPos starting position in the destination data.
* @param length the number of array elements to be copied.
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
Arrays.copyOf()
    public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
        T[] copy = ((Object)newType == (Object)Object[].class)
            ? (T[]) new Object[newLength]  如果newType为Object[]
            : (T[]) Array.newInstance(newType.getComponentType(), newLength);       如果不是,通过反射创建数组
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }
    public static <T> T[] copyOf(T[] original, int newLength) {
        return (T[]) copyOf(original, newLength, original.getClass());
    }
public Object[] toArray()
    public Object[] toArray() {
        // Estimate size of array; be prepared to see more or fewer elements
        Object[] r = new Object[size()];  1
        Iterator<E> it = iterator();  2  (1和2之间数组大小可能改变)
        for (int i = 0; i < r.length; i++) {
            if (! it.hasNext()) //   (如果数组变小)
                return Arrays.copyOf(r, i);
            r[i] = it.next();
        }
        return it.hasNext() ? finishToArray(r, it) : r; (如果数组变大)
    }
     //数组变大,复制变大后面的元素
    private static <T> T[] finishToArray(T[] r, Iterator<?> it) {
        int i = r.length;
        while (it.hasNext()) {
            int cap = r.length;
            if (i == cap) {
                int newCap = cap + (cap >> 1) + 1;   //扩容
                // overflow-conscious code
                if (newCap - MAX_ARRAY_SIZE > 0)
                    newCap = hugeCapacity(cap + 1);  // 限制容量
                r = Arrays.copyOf(r, newCap);
            }
            r[i++] = (T)it.next();
        }
        // trim if overallocated
        return (i == r.length) ? r : Arrays.copyOf(r, i);
    }
    private static int hugeCapacity(int minCapacity) {
        if (minCapacity < 0) // overflow
            throw new OutOfMemoryError
                ("Required array size too large");
        return (minCapacity > MAX_ARRAY_SIZE) ?
            Integer.MAX_VALUE :
            MAX_ARRAY_SIZE;
    }
public <T> T[] toArray(T[] a)
    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);
        Iterator<E> it = iterator();
        for (int i = 0; i < r.length; i++) {
            if (! it.hasNext()) { 数组元素可能改变  ,变少
                if (a != r)            如果用参数中的数组,直接null
                    return Arrays.copyOf(r, i);    否则截取数组
                r[i] = null; // null-terminate
                return r;
            }
            r[i] = (T)it.next();
        }
        return it.hasNext() ? finishToArray(r, it) : r;  变多
    }
AbstractCollection的更多相关文章
- Java集合类源码学习- Iterabel<T>,Colection<E>,AbstractCollection<E>
		Collection<E>接口extends Iteratable<E>接口. Iteratable<T>:实现接口使得对象能够成为“for-each loop”的 ... 
- 容器--Collection和AbstractCollection
		一.前言 容器是JAVA中比较重要的一块,整个体系设计得非常好,同时对于代码学习来说也是比较好的范例.同时很多面试官也比较喜欢用容器来考察面试者的基础知识,所以掌握好容器还是比较重要的.本文主要总结一 ... 
- Java源码初学_AbstractList&AbstractCollection
		一.AbstractCollection抽象类:(提供了Collection接口的骨干实现,以减少实现接口所需要的工作) 1.contains方法 contains方法,通过迭代器对于列表的每一个元素 ... 
- Java 集合深入理解(5):AbstractCollection
		点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天好累,来学学 AbstractCollection 吧! 什么是 AbstractCollection Abstrac ... 
- Java集合类:AbstractCollection源码解析
		一.Collection接口 从<Java集合:整体结构>一文中我们知道所有的List和Set都继承自Collection接口,该接口类提供了集合最基本的方法,虽然List接口和Set等都 ... 
- 源码(05) -- java.util.AbstractCollection<E>
		java.util.AbstractCollection<E> 源码分析(JDK1.7) ------------------------------------------------- ... 
- 彻底理解容器类(2)------- AbstractCollection深入了解
		h2 { background-color: Skyblue } AbstractCollection认识 AbstractCollection是Collection接口的抽象实现.实现了一部分Col ... 
- (二)一起学 Java Collections Framework 源码之 AbstractCollection
		. . . . . 目录 (一)一起学 Java Collections Framework 源码之 概述(未完成) (二)一起学 Java Collections Framework 源码之 Abs ... 
- Java容器解析系列(2) 具体化的第一步——Collection到AbstractCollection
		在通向具体化的List,Queue之前,我们需要先了解一下Collection接口和AbstractCollection抽象类,这两个都是处于Collection顶层的存在. Collection接口 ... 
- JDK源码(1.7) -- java.util.AbstractCollection<E>
		java.util.AbstractCollection<E> 源码分析(JDK1.7) ------------------------------------------------- ... 
随机推荐
- lock和synchronized如何选择?
			1.lock是一个接口,而synchronized是java关键字,synchronized是内置的语言实现. 2.synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁,而l ... 
- 死磕 java同步系列之CyclicBarrier源码解析——有图有真相
			问题 (1)CyclicBarrier是什么? (2)CyclicBarrier具有什么特性? (3)CyclicBarrier与CountDownLatch的对比? 简介 CyclicBarrier ... 
- Unity Shader 菲涅尔环境反射
			菲涅尔反射描述了一种光学现象,当光照到物体表面时,一部分发生反射,另一部分则进入物体内部,发生折射或散射:相比直接的反射和折射计算,菲涅尔反射更接近真实情况. 可用下面的等式近似计算这种反射效果: F ... 
- Web框架之Django重要组件(Django中间件、csrf跨站请求伪造)
			Web框架之Django_09 重要组件(Django中间件.csrf跨站请求伪造) 摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是 ... 
- MCtalk对话抱抱星英语:从Diss在线英语教学乱象到回归教育本原
			在百度搜索输入“在线英语”四字,清一色的线上英语培训品牌琳琅满目,“免费英语学习”.“外教口语一对一培训”.“四级听力”.“专属外教”,竞争之激烈可见一斑,创业公司绞尽脑汁挖掘细分市场,试图在一片红海 ... 
- Hive 学习之路(五)——  Hive 分区表和分桶表
			一.分区表 1.1 概念 Hive中的表对应为HDFS上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大. 分区为HDFS上表目录的子目录,数据按照分区存储在子目录中.如 ... 
- 【MYSQL】mysql大数据量分页性能优化
			转载地址: http://www.cnblogs.com/lpfuture/p/5772055.html https://www.cnblogs.com/shiwenhu/p/5757250.html ... 
- php程序守护进程
			php命令程序实习守护进程2种方式: 1.使用nohup nohup php myprog.php > log.txt & 2.使用程序 function daemonize() { $ ... 
- vSphere克隆虚机重启网卡报错
			使用VMware vSphere克隆虚机,修改IP重启网卡报错: 解决报错: 修改 /etc/udev/rules.d/70-persistent-net.rules 文件,克隆后会多出eth2和et ... 
- 【HDU - 2181】哈密顿绕行世界问题(dfs+回溯)
			-->哈密顿绕行世界问题 Descriptions: 一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市. Input 前2 ... 
