介绍
小编给大家分享一下Java源码解析之接口集合的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!
一、图示
<强>二、方法定义强>
我们先想一想,公司如果要我们自己去封装一些操作数组或者链表的工具类,我么需要封装哪些功能呢?不妨就是统计其大小,增删改查,清空或者是查看否含有某条数据等等。而收集接口就是把这些通常操作提取出来,使其更全面,更通用,那现在我们就来看看其源码都有哪些方法。
//返回集合的长度,如果长度大于Integer.MAX_VALUE,返回Integer.MAX_VALUE int 大小();//如果集合元素总数为0,返回现实 boolean isEmpty ();//判断集合中是否包含指定的元素,其依据是等于()方法 boolean 包含(Object o);//返回一个包含集合中所有元素的数组 对象[],toArray ();//与上个类似,只是增加了类型的转换 & lt; T>, T [], toArray (T [],);//向集合中加入一个元素,如果成功加入则返回真,如果加入失败,或者因集合本身已经包含同个元素而不再加入时,返回错误的 boolean 添加(E e);//从集合中删除指定元素的单个实例 boolean 删除(Object o);//如果集合包含指定集合中的所有元素,返回现实 boolean containsAll (Collection<?祝辞,c);//把指定集合中的所有元素添加到集合中,但在此期间,如果指定的集合发生了改变,可能出现意想不到的事情 boolean addAll (Collection<?, extends E>, c);//从集合中删除所有包含在指定集合中的元素 boolean removeAll (Collection<?祝辞,c);//仅保留集合中包含在指定集合中的元素 boolean retainAll (Collection<?祝辞,c);//清空集合 void 明确();//将此方法抽象,是保证所有子类都覆写此方法,以保证=的正确行为 boolean =(Object o);//同上 int hashCode ();//这个方法在JDK1.8中提供了默认的实现,会使用迭代器的形式删除符合条件的元素 default boolean  removeIf (Predicate<?, super E>,过滤器){ ,,,Objects.requireNonNull(过滤器); ,,,boolean removed =,假; ,,,final Iterator, each =, iterator (); ,,,while (each.hasNext ()), { ,,,,,,,if (filter.test (each.next ())), { ,,,,,,,,,,,each.remove (); ,,,,,,,,,,,removed =,真的; ,,,,,,,} ,,,} ,,,return 切除; }
<强>三、超级实现类AbstractCollection 强>
通过以上的学习,我们可以知道在收集接口中,有很多通用的方法,根据现有的定义以及继承的Iterable接口,都可以在抽象方法中实现,这样就可以减少具体实现类需要实现的方法,所以就有了这么一个类-AbstractCollection。
首先我们来看看api文档对这个类的大概描述:
如果要实现一个不可修改的集合,只需要重写迭代器和大小接口就可以了,并且返回的迭代器需要实现hasNext和Next。而要实现一个可以修改的集合,还必须重写添加方法,返回的迭代器还要实现删除接口。
<强>接下里我们来看看其方法定义强>
//这个毫无疑问,是可以直接获取的 public boolean  isEmpty (), { ,,,return 大小(),==,0; }//这个方法因为迭代器的存在,可以进行一致性封装,这里需要注意的是对象的比较是通过=方法,因为调用到了it.next()与it.hasNext(),这也是为什么文档注释会写实现集合类需要重写迭代器的这两个方法。 public boolean 包含(Object o), { ,,,Iterator, it =, iterator (); ,,,if (o==null), { ,,,,,,,while (it.hasNext ()) ,,,,,,,,,,,if (it.next ()==null) ,,,,,,,,,,,,,,,return 真实; ,,,},{else ,,,,,,,while (it.hasNext ()) ,,,,,,,,,,,if (o.equals (it.next ())) ,,,,,,,,,,,,,,,return 真实; ,,,} ,,,return 假; }//和包含类似,也是通过迭代器实现的,但其会调用拔除()方法,这也是为什么文档注释会写实现可以修改的集合类时需要重写迭代器的删除方法。 public boolean 删除(Object o), { ,,,//÷?这里调用了拔除()方法 }
还有很多方法也用到了迭代器的特性,例如containAll, addAll等等,这里就不一一说明了。