02.Collection的部分规范

60 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情

Collection的部分规范

  1. Collection是集合层次的根接口,但是JDK通常不会提供它的直接实现,而是提供更具体接口如Set/List/Queue的实现.
  2. Collection表示一组对象, 但不会固化这组对象的共有特征, 例如:有些集合的实现可以包含重复元素,有些集合可以包含null对象,而有些集合反之.
  3. 所有Collection的实现类都应该至少实现两个构造器(虽然接口强制要求,但是所有的java库都遵循这个规范):
    1. 一个空构造器,用于创建一个空的集合.
    2. 有一个Collection参数的构造器,它创建一个集合,但是元素和旧集合相同.
  4. 某些方法会在注释中标记为可选,如果具体类未实现对应方法可以选择抛出UnsupportedOperationException.
  5. 有些集合会对包含的元素进行一些限制, 在插入或查询是否包含非法元素时可以选择抛出异常或返回false.

特殊的Collection

从Collection的java doc上得知,它有下面这些比较特殊的派生概念

  1. View Collections. 大多数集合都存在元素管理,而视图自身不会管理元素,而是通过委托的集合进行元素管理.
  2. Unmodifiable Collections. 有些集合是不支持修改的,当执行修改操作是会被抛出UnsupportedOperationException方法.
  3. Unmodifiable View Collections. 当需要把集合的读权限放出去,同时避免被误修改时,提供一个不可变的视图集合出去就非常有用了.但是注意,修改底层集合所发生的变化往往时对视图可见的,所以不可变视图不一定就真的不会变.
  4. Serializability of Collections. 这算是一种警醒了吧,虽然常用的ArrayList/HashMap...都是支持序列化的,但这不代表所有的集合都必须支持序列化.要知道Collection可没实现java.io.Serializable.

Collection中的方法

讨论Collection中方法定义时不可避免的就要说到AbstractCollection, 我理解AbstractCollection的存在,极大程度是因为jdk1.8之前的接口是不支持default方法的. Collection中定义了集合中最基础的增/删/查(元素存不存在/共有多少元素)方法,同时支持其批量操作,同时也给集合转数组提供了支持. AbstractCollection基本将Collection中的方法实现了个遍,概要来说:1. 将查询操作用迭代器的方式实现. 2. 将单个元素的增删操作抛出UnsupportedOperationException异常. 3. 将批量造作转换为单个操作迭代完成. 所以当要实现AbstractCollection的时候会发现我们最少只需要实现iterator和size这两个方法.

Collection中的异常

NullPointerException

当集合不允许插入null元素时可以选择抛出NullPointerException.

UnsupportedOperationException

当集合为实现可选操作时可以抛出UnsupportedOperationException.

ClassCastException

当插入一个或多个与集合不相匹配的元素类型时,可选择抛出ClassCastException.