前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java.util.Collection[源码解读(上)]

java.util.Collection[源码解读(上)]

作者头像
小诸葛
发布2020-04-14 15:54:44
5650
发布2020-04-14 15:54:44
举报
文章被收录于专栏:方法论方法论

前言

本文主要介绍Collection接口的用途。接口的作用是什么呢?我的理解是四个字:制定标准。就像USB接口,尺寸、结构、排线都是统一的,只要是标准USB设备,都可以接入使用。

Collection接口是java集合层次结构的根接口,我们常用的Set和List及其子类基本都直接或间接的实现了此接口。什么是集合呢?集合可以说是一组对象的体现,这些对象又被称为集合的元素。一些集合允许重复的元素存在(例如List),而一些集合不允许(例如Set)。一些集合中的元素是有序的(例如List),而一些是无序的(例如Set)。jdk并未为Collection接口提供任何的直接实现类,而是提供了一些更具体的子接口,例如Set和List。Collection接口通常用于在需要最大通用性的地方传递并操作集合。

可能含有重复元素的无序集合应该直接实现此接口。

所有通用的Collection实现类都应该提供两个标准构造方法:一个是无参构造方法,通过此方法可以创建一个空的集合;一个是含有一个参数的构造方法,此参数为Collection类型(需指定泛型),这个方法可以创建一个集合元素类型和传递的参数类型相同的新集合。实际上,第二个构造方法允许用户拷贝一个集合,用以生成和所需类型等效的集合。但是没有办法强制执行这项公约(因为接口是不可以有构造方法的),但是java平台库中提供的所有通用的Collection实现类都符合此公约。

此接口含有一些“破坏性”的方法,这些方法可以修改所操作的集合,如果集合不支持这些方法,将会抛出UnsupportedOperationException异常,当调用这些方法对于操作的集合没有影响的情况下,这些方法可能但并不被要求抛出此异常。例如,当在不允许被修改的集合上调用这些方法时,如果被添加的集合是空的,则此异常可能但不被要求抛出。

一些集合对于它们可能包含的元素有一定的限制。例如:一些实现类禁止含有null元素,而一些对元素的类型有限制。当试图往集合中添加一个不适当的元素时会抛出unchecked exception(未经检查的异常),典型的如:NullPointerException和ClassCastException,或者仅仅返回false;有些实现类表现前一种行为,有些表现后一种行为。更一般而言,当试图对不符合条件的元素执行操作,而该元素的完成不会导致将不符合条件的元素插入到集合,这可能会抛出异常,也可能会成功,这取决于实现类的选项。这些异常在这个接口中被标记为可选的。

每个接口实现类都可以决定自己的同步策略,在实现类缺少强有力的策略的时候,如果调用某个正在被其他线程修改的集合的方法的时候,可能会产生某些无法预知的行为,包括直接调用和将集合传递给可能执行调用的方法,以及使用现有的迭代器检查集合。

集合框架接口中的某些方法是从equals方法角度定义的。例如:contains方法的说明这样写道:当且仅当集合中包含至少一个符合以下条件的元素e的时候返回true:

o==null ? e==null : o.equals(e)

但是这个说明不应该被理解为这个contains方法有这样的暗示:当contains的参数e为非null元素时,o.equals(e)就一定会被调用。实现类可以自由的优化从而使得equals方法不被调用,例如:可以首先比较这两个元素的hash码(hash码相同时再通过equals比较)。hashCode方法的说明里这样保证道:hash码不同的两个对象是不会相等的。更一般而言,众多集合框架的实现类可以自由地利用它认为合适的Object类下面的方法。

一些对集合执行递归遍历的操作可能会失败,但对于直接或间接包含其自身的自引用除外。这些方法包括clone、equals、hashCode和toString。实现类可以选择性的处理自引用情况,但是绝大部分现有的实现类并没有这么做。

集合实现类(继承的或其他的)不用应用任何同步协议,如果一个Collection的实现类有指定的同步协议,那么这个实现类的实现者必须覆写默认实现来应用该协议。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小诸葛的博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档