今天饶有兴趣的打开了 java 文档,点开上面的 TREE,可以看到各个类的依赖关系,但是这里还是看不到和接口的关系,因为类可以实现多个接口的,所以在这样的文档中就不好展现了吧。
因为平常使用中,集合类用的比较多,所以想写一下结合类的内容,下面可以看到集合类的关系,这样看上去还是蛮清楚的吧,我们就先来看看第一个 AbstractCollection
可以看到继承 AbstractCollection 类的关系,看这个比看那些图清晰了一些,这里没有展现出来的是实现的两个接口
Iterable<E>
, Collection<E>
在 Collection 中是里面定义饿了集合该实现的方法,这里面还涉及到泛型的概念,直接继承的有AbstractList
, AbstractQueue
, AbstractSet
, ArrayDeque
, ConcurrentLinkedDeque
让我们先来看看 Collection<E> 接口里面定义了哪些要实现的通用方法吧,其实可以看到是 interface Collection<E> extends Iterable<E> ,以下是 java 8 中 Iterable 的方法 ,在之前的版本应该是没有 default 定义的接口实现的。
在 Collection<E> 中定义集合的一些方法,java 1.8 (可以看到 default 的 stream 方法),像集合的 hashCode, add ,equals 都是很值得一说的,在effective java 讲的比较多,我就等着出第三版的时候买一本吧,可能啊亚马逊上英文版的好贵呀。
然后看看今天的标题 AbstractCollection 抽象类,看看里面实现了哪些方法
我们看看contains 方法,这里用了迭代器返回的进行遍历,其实 iterator()方法是实现类自己实现的,这里会对传值是否为 null 的判断,因为下面会使用 equals 方法。
我们看到的报 UnsupportedOperationException 就是这么来的
这个 remove 方法和contains 方法如出一辙
containsAll 方法遍历集合里面的元素,但是contains 会判断 参数是否为空,但是这里又不会,那么这么写list.containsAll(null); 不会报错了。
addAll 这里会记录有没有修改 modified 字段标识,这里就看怎么实现的,相同的 item 到底算不算 add 成功,这里就可以玩点花样了。
removeAll 这里又对参数 c 做了判断,真是奇怪,这里有什么讲究吗?
最后看看 toString 方法吧,因为 String 是会变的,所以用了 StringBuilder,只是这一行 sb.append(e == this ? "(this Collection)" : e); 这个this 是代表集合自己吗?
这里还看不太明白的是 toArray 方法,为什么要这么写呢,暂时还想不明白,再看看吧