您的位置:首页 > 编程语言 > Java开发

源码分析-java-collection接口

2016-07-13 18:24 260 查看
以下内容是api资料的简单汇总:

API概述

Collection接口是集合继承的根,一个集合表示一组对象,即元素,的集合。Collection是一个抽象层次比较高的类,java没有提供直接的实现,通常都是对子类提供实现。

一般的Collection实现应该提供两种标准的构造器:

一个是无参构造器,用于创建一个空集合

另一个是有参的构造器,参数为集合内集合内元素。(当然这个方法并没有办法提供强制类型转换,因为接口没办法包括构造器,但是所有的通用Collection实现都应该遵循)

Collection包含一些有破坏性的方法,也就是说在使用这些方法的时候会修改内部元素。

如果这个Collection实现不支持这类操作必须丢出UnsupportedOperationException

如果这个操作无效但是不会产生副作用,也应该丢出UnsupportedOperationException,但是不强制丢出。

一些collection实现对于元素类型有限制,例如有些不允许空元素或者限制的类型。

如果一个不合格的元素需要插入,应该丢出一个unchecked 异常,通常是NullPointerException 或者ClassCastException。

更一般的情况,其他操作一个不合格数,导致一个不合格数插入集合应该丢出一个集合或者成功。这取决于具体的实现如何选择。通常这类一次被标记为可选的(optional)

some implementations will exhibit the former behavior and some will exhibit the latter. 原文这句话没看懂。

对于集合的同步策略来说,如果没有来实现的同步策略,默认情况下回导致被其他线程被修改。可以通过集合的方法修改或者通过迭代器修改。

很多Collection框架接口定义了equals方法。但是Collection没有提供任何的实现,通常都是由子类的实现提供,例如
o==null?e==null:o.equals(e))
是比较典型的写法。但是也要根据具体情况来看。

需要提醒的一点是对于有些遍历的操作,可能会由于集合指向它自己而导致一些异常而失败,比如说clone(), equals() hasCode()和toString()。实现可以有选择性的实现这个类但是大多数实现并没有这么做。

源码分析:

源码上没有找出来任何需要特别注意的地方:

整个源码都只有声明,也没有声明异常,异常都是根据实现来抛出的。

整个Collection只包含了一个实现:

default boolean removeIf(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
boolean removed = false;
final Iterator<E> each = iterator();
while (each.hasNext()) {
if (filter.test(each.next())) {
each.remove();
removed = true;
}
}
return removed;
}


这里用了1.8版本之后的才有的Predicate接口,filter.test用来测试是否符合某个lamda式子。

这里用到策略模式(应该是。。)Predicate类当然也没有具体实现test。这个需要看具体实现来判断怎么做合适。

另外提醒下default表示包内可见。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java Collection