JDK源码阅读——集合框架——Collection接口

java集合框架分为两部分,一个是Map,采用的是key,value形式;另一部分就是Collection接口,他是set,list的最终父亲接口。

我们先来看一下他的定义

public interface Collection extends Iterable

首先,他带有泛型,其次,他继承自Iterable接口,说明其实现类可以使用迭代器遍历元素。

我们要注意Collection只是一个接口,所以他定义了一些方法,我们来看一下

JDK源码阅读——集合框架——Collection接口_第1张图片

  • int size();

    size方法的主要作用是返回当前collection对象中存储的元素个数。但是,如果当前collection中元素的个数超过了Integer所能代表的最大整数,那么只能返回Integer的最大值

  • boolean isEmpty();

    isEmpty方法的作用是判断当前collection对象中是否存储元素,如果存储元素则返回true,反之返回false;

  •  boolean contains(Object o);

    contains方法是用来判断Collection对象中是否包含指定元素(参数o),参数o为Object类型。如果包含o,返回true,反之返回false。值得注意的是,如果o为null,Collection对象中有个元素也为null,那么也返回true。当参数o不是collection泛型支持的元素时,可以选择爬出ClassCastExpection异常。当参数o为null而且Collection对象不支持存储null的时候,可以选择抛出NPE异常

  •  Iterator iterator();

    iterator方法返回此Collection对象的迭代器对象,但是这个方法并不保证返回的元素顺序,除非集合本身对元素已经进行了排序

  •  Object[] toArray();

    toArray方法是将Coolection对象转换为一个包含Coolection对象内所有元素的Object类型的数组,而且,如果Collection对象已经通过迭代器排序过了,那么数组中的元素顺序也是同样的顺序。这个方法实现的时候需要注意,返回的数组必须是“安全的”,因为collection对象不会对这个数组引用做出任何操作(增删改)。换句话说,即使这个Collection对象是由数组支持的,方法实现的时候也必须重新分配一个数组作为返回值,以便调用者可以自由的修改返回的数组。

  •   T[] toArray(T[] a);

    toAray(T[] a)方法的作用也是将Collection对象转换为一个包含Collection内所有元素的数组。但是toArray(T[] a)加入了泛型,说的官方一点就是运行时类型。众所周知,Collection对象是支持泛型的,那么toArray(T[] a)方法的参数就是Collecion对象支持的泛型的数组对象。不过,我们不禁要问了,如果Collection对象的泛型和数组参数的类型不一致(不匹配)怎么办,注释中说,这时候要求实现类重新构造一个数组,类型为参数指定的数组类型,数组大小为Collection对象中元素的数量。值得一提的是,如果数组的长度比Collection对象中元素的数量多的话,多出的部分会用null填充。这时候,就很要求调用者在知道Collection对象不支持存储null的时候,能够确定一下Collection中元素的数量。还需要注意的一点是,在功能上来讲,这个方法和toArray()是相同的,唯一不同的地方就是加入了泛型支持。实现类在实现此方法的时候可以根据需要抛出相应异常。例如,当数组的运行时类型和集合内的泛型无法兼容(即数组内的类型不是集合泛型的爹及以上的时候)可以选择抛出ArrayStoreException。当参数数组为null时,可以选择抛出NPE异常。

 boolean add(E e);

add方法比较简单,就是向集合中增加一个元素。当元素成功插入集中时返回true,如果集合内已经有了这个元素并且集合不允许有重复元素的情况下,返回false。接下来的一段话都是针对,自己手动实现这个add方法的类来说的,也就是针对Collection的实现类来说的。文档告诉我们,凡是支持add方法的集合,都可能存在着对插入元素的限制,有的不允许插入重复元素,有的不允许插入null,还有的会对插入元素的类型做出限制。因此,集合的实现类应该清晰的在文档里写清楚这些插入限制。另外,如果如果一个集合不允许插入某个特定的元素,而原因不是因为集合内部已经存在了这个元素,那么add方法应该抛出一个异常而不是返回false;这条规定可以保证调用者在执行add操作后集合仍然具有针对这个元素的不变性。(不变性,意思是这个指定元素违反了此集合类的限制插入规则)。实现类根据自己需要可以在抛出一下异常。

  1. 当此集合类不支持插入操作(add方法)时,抛出UnsupportOperationException;
  2. 当目标元素的类型是集合限制不允许类型之一的时候,会抛出ClassCaseException
  3. 当目标元素为null,但是集合类不允许存储null时。抛出NPE
  4. 当目标元素的一些属性不允许元素被插入集合类中时,抛出IllegalArgumentException
  5. 当目标元素违反了集合限制插入规则时,抛出IllegalStateException
  •  boolean remove(Object o);

    作用:如果参数所代表的元素存在,那么就移除这个元素在集合中的一个单个实例。如果集合允许存储null,而且集合内部至少有一个null,那么当参数为null时,也会从集合中移除一个null。返回值的定义很有意思:当集合确实移除了一个指定元素o,而且o也确实存在于集合中,或者说调用此方法之后,集合发生了改变,那么就返回true。不符合这种情况的肯定就返回false了。与add方法差不多,实现类也会根据不用情况抛出一些异常 。

  1. 当指定元素的类型与集合的泛型类型不匹配,不兼容时,可以抛出ClassCastException

  2. 当指定元素为null,集合中不允许存在null时,可以抛出NPE

  3. 当此集合类不支持remove操作时,会抛出UnSupportedOperationException

  • boolean containsAll(Collection c);

    大家都是理科生,我就把话明说了,这个方法的作用就是为了判断参数集合对象C所拥有的元素是否是当前集合对象所拥有的元素的子集。文档上说,当前集合对象拥有参数集合对象C所拥有的所有元素时,返回true。反之,返回false。

  1. 当参数集合对象C中的元素类型存在与当前集合对象不兼容时,可以抛出ClassCastException

  2. 当参数集合对象C中存在null但是当前集合对象不允许存储null时,可以抛出NPE

  •  boolean addAll(Collection c);

    方法的作用是将参数集合C中的所有元素全部都插入当前集合对象中。但是,我们要注意的是,如果在执行addAll方法的时候,参数C发生了改变。那么,这个操作产生的结果是不确定的,也就是文档中说的这种操作行为是不明确的。这意味着,如果参数C就是当前集合对象,那么。。。我们谁也不知道这个操作的意义是什么(除非调用者有病)。返回值非常好确认,当执行过addAll后,当前集合对象发生了改变,那么就返回true;否则,返回false

  1. 当当前集合对象不支持addAll操作时,会抛出UnSupportOperationException

  2. 如果参数C中某一个元素的类型不允许被插入当前集合对象时,抛出ClassCastException

  3. 如果参数对象C中存在null但是当前集合对象不允许为null,或者参数C为null,会抛出NPE异常

  4. 当参数对象C中元素的一些属性不允许元素被插入集合类中时,抛出IllegalArgumentException

  5. 当参数对象C中元素违反了集合限制插入规则时,抛出IllegalStateException

  •  boolean removeAll(Collection c);

    这个方法的作用看名字也知道是干啥的,就是当前集合对象和参数集合对象取差,移除当前集合对象内部所有参数集合对象拥有的元素。也就说,执行完这个操作之后,当前集合对象,和参数集合对象拥有的元素将没有交集。如果当前集合对象执行完此方法后,当前集合发生了改变,那么就会返回true。否则,返回false。同样,在一些特定情况下会跑出UnsupportedOperationException,NPE,ClassCastException。

  •  

    boolean retainAll(Collection c);

    这个方法的作用就比较有意思了,作用是只保留当前集合中包含在参数集合中的元素,也就是说,只保留二者的交集。你也可以理解为当前集合移除了所有不被包含在参数集合内的元素。返回值的定义、抛出的异常与removeAll相同。

  •  void clear();

    集合类的清除方法,这个方法将会移除集合内所有的元素,集合调用此方法后,集合拥有的元素数量为0。如果集合不支持clear方法,可以抛出UnsupportOperationException。

  •  boolean equals(Object o);

    作用没啥好说的,就是看参数o和当前集合是不是相等。不过我们要注意一个问题,如果没有什么特殊需求(比如根据值对比),这个方法的默认实现采用的是Object的equals实现。可能你没看懂啥意思,不过没关系,他只是一个方法声明,具体怎么回事,我们可以看具体的方法实现,特别是List和Set接口。

  • int hashCode();

    返回当前集合对象的哈希值。一般来说,没人去单独实现这个方法,都是直接调用Object类的hashCode()方法。但是,需要注意一点,任何一个类只要重写了equals方法,那么同样,他也必须重写hashCode()方法。这是为了满足一个恒等式:a.equals(b) 一定可以推导出a.hashCode == b.hashCode

 

你可能感兴趣的:(java)