Java源码学习之collection(容器)

容器

  一个容器包含了一系列的对象,即它的元素。有些容器允许重复元素,有些则不,有些容器是有序的,有些则不。      

  JDK没有对该接口提供任何直接的实现,它提供的是一些更明确的子接口的实现,比如Set和List。

  所有一般用途的容器实现类(即通过容器的子接口间接地实现了容器)都应该包含两个标准的构造器:一个是创造空容器的控构造器;另一个是以一种容器作为参数的构造器,它将创造一个与它的参数有着相同元素的新容器。事实上,第二种构造器能够复制任何的容器。然而,由于接口不能包含构造器,因此不能在这执行这项“条约”,不过Java平台库中所有一般用途的容器都执行了这些操作。

  这一接口中包含着“有害”方法,即有一些改变容器的操作中会抛出“UnsupportedOperationException”的异常,这是由于该容器不支持这一操作。

  一些容器的实现对可包含的元素有限制。比如一些实现禁止null元素,还有一些会限制元素类型。尝试添加不合格的元素会抛出未检查的异常,比如“NullPointerException”、“ClassCastException”。尝试查询不合格元素也可能会抛出异常,或者可能直接返回false;也有一些会展示之前的元素,而有一些会展示之后的元素。一般而言,对于结果不是将不合格元素插入容器的操作,这种对不合格元素的操作可能会抛出异常也可能会成功。在这一接口的规范中,此类异常被记为“可选的”。

  容器的同步政策由自己决定,当缺失实现的强大保障时,如果容器正在被其他线程改变,调用容器的任何方法都可能导致未定义的行为。这包含直接调用、将容器传递给可能执行调用的方法以及使用一个已存在的迭代器检测这个容器。

  在Collections框架接口下的很多方式都被定义为Object.equals(Object)的形式。比如contains(Object) contains(Object o)的规范中说道:当且仅当容器包含了至少一个element e时返回true,即o==null?e==o.equals(e)。这种规范不应该被理解为:这暗示了以一个非null参数调用Collection.contains将会调用o.equals(e)。为了优化,实现是自由的。因此,equals的调用是应当避免的,比如可以首先比较两个元素的哈希值。Object.hashCode()的规范保证了两个有着不同哈希值的对象是不可能相等的。各种容器框架接口的实现都是自由的,只要开发者认为合适就行,以此来发挥底层方法特定功能的优势。

  一些对容器使用了递归遍历的操作可能会引起自身引用实例的异常而失败,此处容器直接或间接地包含了自身。这包含了clone(), equals(), hashCode(), toString()方法。实现应当处理好自我引用的情况,然而大部分的实现都没有。

容器接口的一些操作:

      1.查询性操作。

  int size(): 返回容器中的元素个数

  boolean isEmpty(): 如果容器不包含任何元素则返回True

  boolean contains(Object o): 当且仅当容器包含至少一个该特定的元素时返回True;当特定元素与该容器不匹配时抛出“ClassCastException”异常,当特定元素为null时抛出“NullPointerException”异常。

  Iterator<E> iterator(): 返回一个此集合中元素的迭代器。没有关于元素返回顺序的保证(除非该容器是提供了保证的类的实例)。

  Object[] toArray(): 返回一个包含了容器中所有元素的数组。如果该容器有决定其迭代器返回元素顺序的保证,该方法一定会以相同顺序返回元素。如果该容器中没有保留任何对返回数组的引用,则该返回数组是“安全”的。

  <T> T[] toArray(T[] a): 返回一个包含了容器中所有元素的数组。返回数组运行时的类型就是特定数组运行时的类型。如果容器符合特定数组。如果该容器符合特定的数组,则将其返回到其中(数组中的原内容会被覆盖)。否则,将会根据特定数组运行时的类型和该容器的类型分配一个新数组(原数组不被覆盖)。如果容器符合特定数组且特定数组有较多的空间,则容器末尾之后的数组元素被赋为null,这对于不包含null的容器可知其长度。如果该容器包含了决定其迭代器返回元素顺序的保证,则该方法以相同顺序返回。在特定环境下可用来节省分陪成本。toArray(new Object[0]) 等价于toArray()。

      2.修改型操作

         boolean add(E e): 确保容器包含了特定的元素。如果容器因调用而改变则返回True,如果此容器不允许复制且已经包含该特定元素则返回False。

         boolean remove(Object o): 从该容器中删除一个特定的实例。当容器含有该特定元素时返回True。

     3.批操作

         boolean containAll(Collection<?> c): 当容器中包含所有特定容器中所有元素时返回True。

        boolean addAll(Collection<? extends E> c): 将特定容器中的所有元素加入当前容器。当执行中特定容器改变时,该操作的行为未被定义。

        boolean removeAll(Collection<?> c): 删除容器中所有同样存在于特定容器中的元素。调用后,两个容器中不会有相同元素。

        boolean removeIf(Predicate<? super E> filter):  删除容器中所有满足predicate的元素。

        boolean retainAll(Collection<?> c): 保留容器中特定容器所包含的所有元素。

        void clear(): 删除容器中的所有元素。

     4.比较和哈希

        boolean equals(Object o): 比较特定对象于容器是否相等。

        int hashCode(): 返回该容器的哈希值。

      以下自Java1.8开始独有。

        default Spliterator<E> spliterator(): 创造该容器中元素的可分迭代器。

        Stream<E> stream(): 将容器作为源返回一个顺序流。

        default Stream<E> parallelStream(): 将容器作为源返回一个可能的平行流。允许该方法返回一个顺序流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值