请对应上一篇博客的源码查看
Java集合的学习路径
这篇博客主要通过从源码开始重新来学习Collection,来加深对Java集合的认识。我们都知道Collection接口是List、Set、Queue接口的父类接口,那么如果我们了解了Collection接口,也就明白了这些集合的共性,后续再继续学习各个接口的实现类也就只需要各自实现类的特性就行了。因此从上而下的学习,从集合的共性到集合的特性。做到事半功倍!
源码学习:1、Collection接口的介绍
参考源码:从33行到122行
关于源码中对Collection接口的介绍,做如下总结。
- Collection接口概述
- Collection是集合层次结构的根接口;
- 一些集合允许重复元素、有些不行;
- JDK中不提供Collection接口的任何直接实现类;只提供其更具体的子类。
- 对Collectionl接口的实现类的要求
- 所有的Collection的实现类都是间接实现其子接口来实现。并且所有的实现类应该提供两个标准的构造方法。
- Collection中的能改动集合的方法特征
- Collection中定义的方能够改变集合的方法存在一些特征。在不同的实现类中,这写方法可能产生不同的效果。比如说addAll(Collection())方法,在不同的实现类中,addAll方法的参数要求是不一致的,如果添加同样的元素,在不同的实现类中,返回的结构不一样。
- 所有的子类接口或实现类都应直接的或间接的定义equals()方法
- 实现类重写的equals()和hashCode()方法应该具有这样的一个原则:如果equals返回true,那么两个对象的hashcode的值应该保持相等。
- 默认方法实现(继承或其它)不应用任何同步协议。如果Collection实现具有特定的同步协议,那么它应该覆盖默认实现以应用该协议。
源码学习:2. Collection接口中的方法
Collection接口的定义:
public interface Collection<E> extends Iterable<E>{}
- 带泛型:支持特定类型的数据的存储
- 继承Iterable接口,因此Collection中也有Iterable接口的方法。
- 方法一
size();//用于返回该集合的元素数目。
- 方法二
boolean isEmpty();//用于判断集合是否含有元素。如果没有元素则返回True,否则返回false
- 方法三
boolean contains(Object o);
- 如果集合中包含Object o 时,返回true;更具体的是集合中至少包含一个o时返回true。
- 类型转换异常:如果Object o的具体类型同集合存储的具体元素的类型不一致时,返回
ClassCastException
; - 空指针异常:如果Object o 为null,并且该集合不允许存储null元素,则返回
NullPointerException
- 方法四
Iterator<E> iterator();
- 返回一个iterator用于遍历集合的元素;
- 该iterator无法保证遍历的元素的顺序,当集合为无序集合时。
- 方法五
Object[] toArray();
- 返回一个包含该集合中所有元素的数组;
- 如果该集合为有序集合,那么调用该方法将返回的一个跟集合元素顺序一样的数组;
- 该方法是集合同数组的一个桥接方式。
- 方法六
boolean add(E e);
- 用于确定集合包含该具体的元素
- 返回值:如果集合因调用该方法而发生改变则返回True;如果集合不允许重复并且已经有了该元素,则返回false;
- Collection接口支持该方法,在实际实现类中使用其添加元素时可能存在很多限制。比如有的集合不允许添加null元素,其它集合限制添加元素的具体类型。因此集合的实现类应该清楚的明确和限制哪些元素可以被添加、哪些应该不能被添加。
- 如果一个集合拒绝添加一个元素的原因不是:该元素集合已存在,那么不能是简单的返回一个false,而必须抛出一个异常
- 异常:
UnsupportedOperationException
:假如add操作不被该集合支持;ClassCastException
:假如该添加的元素的类型不被该集合支持,则抛出类型转换异常;NullPointerException
:添加的元素为null,并且该集合不支持存储null元素,则返回空指针异常;IllegalArgumentException
:如果元素的某些属性阻止其添加到该集合IllegalStateException
:如果由于插入限制,此时无法添加该元素;
- 方法七
boolean remove(Object o);
- 从该集合中删除指定元素,如果该元素存在的话。更正式的,删除元素e,使得(o == null ? e==null:o.equals(e))。
- 如果集合中的一个元素已被调用该方法而被删除,则返回true.
- 异常:主要包括空指针异常、类型转换异常、不支持操作异常
- 方法八
boolean containsAll(Collection<?> c);
- 如果该集合包含指定集合中的所有元素,返回true;
- 异常:类型转换异常、空指针异常。如果指定集合中的一个或多个元素与此集合不兼容返回类型转换异常;如果指定集合包含一个或多个空元素,并且此集合不允许空集合,或者指定集合为空,则返回空指针异常。
- 方法九
boolean addAll(Collection<? extends E> c);
- 将指定集合中的所有元素添加到此集合。
- 方法十
boolean equals(Object o);
- 将指定的对象与此集合进行比较获取相等;
- 一个既不实现类List或Set集合类自定义equals()方法时自定义集合,该集合与任何列表或集合进行比较时必须返回false。
- 方法十一
int hashCode();
- 返回此集合的hashcode值;
- 重写equals方法也必须重写hashCode方法,并且满足当equals方法返回true时,hashcode值应该相等;
- 方法十二
boolean removeAll(Collection<?> c)
- 删除指定集合中包含该集合的所有元素;
- 异常:空指针异常、类型转换异常
- 方法十三
boolean retainAll(Collection<?> c);
- 从集合中删除集合c中不包含的元素
- 异常:空指针异常、类型转换异常
源码解析:3. Collection接口方法的特征
- 常见异常:空指针异常、类型转换异常、操作不支持异常;
- equals方法和hashcode的绑定性
- 涉及集合的增删改查的方法一般会抛出异常。