看看 AbstractCollection 吧

今天饶有兴趣的打开了 java 文档,点开上面的 TREE,能够看到各个类的依赖关系,可是这里仍是看不到和接口的关系,由于类能够实现多个接口的,因此在这样的文档中就很差展示了吧。html

由于日常使用中,集合类用的比较多,因此想写一下结合类的内容,下面能够看到集合类的关系,这样看上去仍是蛮清楚的吧,咱们就先来看看第一个 AbstractCollectionjava

能够看到继承 AbstractCollection 类的关系,看这个比看那些图清晰了一些,这里没有展示出来的是实现的两个接口 api

Iterable<E>Collection<E>oracle

在 Collection 中是里面定义饿了集合该实现的方法,这里面还涉及到泛型的概念,直接继承的有AbstractListAbstractQueueAbstractSetArrayDequeConcurrentLinkedDeque app

让咱们先来看看 Collection<E> 接口里面定义了哪些要实现的通用方法吧,其实能够看到是 interface Collection<E> extends Iterable<E> ,如下是 java 8 中 Iterable 的方法 ,在以前的版本应该是没有 default 定义的接口实现的。ui

在 Collection<E> 中定义集合的一些方法,java 1.8 (能够看到 default 的 stream 方法),像集合的 hashCode, add ,equals 都是很值得一说的,在effective java 讲的比较多,我就等着出第三版的时候买一本吧,可能啊亚马逊上英文版的好贵呀。this

而后看看今天的标题 AbstractCollection 抽象类,看看里面实现了哪些方法3d

咱们看看contains 方法,这里用了迭代器返回的进行遍历,其实 iterator()方法是实现类本身实现的,这里会对传值是否为 null 的判断,由于下面会使用 equals 方法。code

咱们看到的报 UnsupportedOperationException 就是这么来的htm

这个 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 方法,为何要这么写呢,暂时还想不明白,再看看吧

相关文章
相关标签/搜索