一点一点看JDK源码(一)Collection体系概览html
liuyuhang原创,未经容许进制转载java
本文举例使用的是JDK8的API数组
1.综述安全
Collection为集合类,是jdk中最为经常使用的类了,实际上我并不认同这个东西叫作集合数据结构
我更倾向于叫作容器,固然容器不止有它一种。多线程
在计算机专业中,大概都会学一门叫作《数据结构》的课程吧并发
本质上来讲,数据结构,其实是设计一种容器,而容器的特性大致包括以下:框架
在个人眼中,Collection是容器的框架集,其中包含了咱们常用的容器,ide
2.Collection的关注点函数
Collection隶属于java.util包。在本文中不讨论concurrent包或其余派生集合体系,只讨论基础
从Collection类的原码类注释@see中可看到,集合体系的大概设计中重点关注的以下:
之因此只关注这些,主要有两方面缘由:
①咱们的时间和技术水平有限,不可能完整的看完JDK
②JDK中的任何设计都是迭代产生的,咱们没有必要看旧版本而不更新的类
接下来将依照上述内容,从接口底层给它从头扒到尾,虽说Collection中@see的是这些
可是关注点确定不止于此。
3.Collection剖析
先上Collection源码,去掉原doc注释,我想写的内容直接写在贴出来的代码中做为注释了。
1 public interface Collection<E> extends Iterable<E> { 2 // Query Operations 原注释,不明意义 3 4 //定义size方法,应返回size大小,最大值为Integer.MAX_VALUE 5 int size(); 6 7 //定义isEmpty方法,用于返回是否为空 8 boolean isEmpty(); 9 10 //定义contains方法,判断一个obj是否属于此集合 11 boolean contains(Object o); 12 13 //定义迭代器方法,返回一个迭代器对象 14 Iterator<E> iterator(); 15 16 //定义转换为转换Obj数组的方法,返回一个obj数组 17 Object[] toArray(); 18 19 //定义转换为泛型T数组的方法,返回一个指定泛型的数组 20 <T> T[] toArray(T[] a); 21 22 //定义add方法,添加一个元素e,并返回添加成功标志 23 boolean add(E e); 24 25 //定义remove方法,移除一个元素obj,并返回移除元素成功标志 26 boolean remove(Object o); 27 28 //定义containsAll方法,判断是否包含集合实例对象c 29 boolean containsAll(Collection<?> c); 30 31 //定义addAll方法,添加集合实例对象c到本实例中 32 boolean addAll(Collection<? extends E> c); 33 34 //定义removeAll方法,从本实例中移除集合实力对象c 35 boolean removeAll(Collection<?> c); 36 37 38 /** 39 * jdk8新增 40 * 大意为: 41 * 定义removeIf方法,该方传递参数为函数式,传递内容是一个接口类型,该接口类型 42 * 定义为一个filter函数,该函数用于传递给Objects.requireNonNull判断,而后调用 43 * 迭代器,将知足该定义的filter的本实例中的元素移除 44 * @since 1.8 45 */ 46 default boolean removeIf(Predicate<? super E> filter) { 47 Objects.requireNonNull(filter); 48 boolean removed = false; 49 final Iterator<E> each = iterator(); 50 while (each.hasNext()) { 51 if (filter.test(each.next())) { 52 each.remove(); 53 removed = true; 54 } 55 } 56 return removed; 57 } 58 59 //定义retainAll方法,取本例与集合实例c的交集,判断交集元素数量是否大于0 60 boolean retainAll(Collection<?> c); 61 62 //定义clear方法,清除本例集合中的全部元素 63 void clear(); 64 65 // Comparison and hashing 原注释,不明意义 66 67 //不解释 68 boolean equals(Object o); 69 70 //定义hashCode方法,获取hashCode标记的方法 71 int hashCode(); 72 73 /** 74 *jdk8新增 75 *大意为: 76 *将迭代器拆分,重写自Iterable接口,从已知元素数量的本例中返回拆分后的迭代器 77 *此方法返回的为本类自己 78 *子类可能重写迭代器拆分,将一个集合的迭代拆分为多个集合的迭代交由多个线程 79 * @since 1.8 80 */ 81 @Override//重写父类 82 default Spliterator<E> spliterator() { 83 return Spliterators.spliterator(this, 0); 84 } 85 86 /** 87 * jdk8新增 88 * 大意为: 89 * 将默认的迭代器拆分后的结果,聚合为流,该流并不是io中的流, 90 * 是一种相似于数据排序操做流 91 * @since 1.8 92 */ 93 default Stream<E> stream() { 94 return StreamSupport.stream(spliterator(), false); 95 } 96 97 /** 98 * jdk8新增 99 * 同上,可是具体其余的实现中,由于可并行,因此多是线程不安全的 100 * 101 * @since 1.8 102 */ 103 default Stream<E> parallelStream() { 104 return StreamSupport.stream(spliterator(), true); 105 }
以上代码对Collection接口中的方法进行了简单的解释,同时对java8新增的一些方法也进行了简单的解释。
由于定义的都是接口,实际实现的方法很是的少,
而应java8多线程的特性提供的一些default方法也有子类去实现。
在堆Collection接口中的源码进行了解的同时,不要忘记此接口继承了Iterable接口。
所以Iterable接口也一定要看一下的,内容比较少,可是经过源码的剖析,发现了集合类的共性:
集合做为容器,其体系中的全部集合都包括了:
大小(size),判空(isEmpty),添加元素(add),删除元素(remove),是否包含(contains)
转换数组(toArray),清空(clear),遍历与迭代(forEach(父接口中),iterator)
是否相同(equals),哈希(hashCode),求交集(retainAll)
除此以外,提供了java8的分离接口,聚合接口,为了大容量集合的多线程操做
注意,Collection接口并无重写父接口的forEach方法,而iterator方法虽然有出现,可是没有@Override注解
一样贴一下代码,一样的去掉原doc注释,我想写的内容直接写在贴出来的代码中做为注释了。
1 public interface Iterable<T> { 2 3 //定义iterator方法,返回迭代器 4 Iterator<T> iterator(); 5 6 /** 7 * jdk8新增 8 * 大意为: 9 * 根据action调用Objects.requireNonNull进行过滤 10 * 过滤结果调用for循环取出, 11 * @since 1.8 12 */ 13 default void forEach(Consumer<? super T> action) { 14 Objects.requireNonNull(action); 15 for (T t : this) { 16 action.accept(t); 17 } 18 } 19 20 /** 21 * jdk8新增 22 * 大意为: 23 * 分离迭代器,将未知大小的迭代器进行拆分,返回拆分的迭代器自己 24 * 25 * @since 1.8 26 */ 27 default Spliterator<T> spliterator() { 28 return Spliterators.spliteratorUnknownSize(iterator(), 0); 29 } 30 }
有时候咱们并不怎么关心父接口的问题,可是实际上这个问题有点重要的仍是,上两张图解释一下:
不要觉得以上两种接口定义实现类的方式没区别,实际上有区别,区别大了,可实现的方法列表有差别
该问题具体解析,将在后续更新中详细写代码测试。
Collection接口内容较少,多数都只是定义了必要内容,具体实现较少。难点都在java8中的default方法上了
等之后弄完全明白了可能再写通俗解释和经常使用方式。
明天更对于List接口的剖析和ArrayList的简要剖析!
以上!