专栏首页Vi的技术博客Java基础系列(三十九):集合之Collection

Java基础系列(三十九):集合之Collection

框架图

-w152

可以看出,作为顶级的框架,Collection仅仅是继承了Iterable接口,接下来,我们来看一下Iterable的源码,看看有什么收获。

public interface Iterable<T> {

    Iterator<T> iterator();

    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

    default Spliterator<T> spliterator() {
        return Spliterators.spliteratorUnknownSize(iterator(), 0);
    }
}

可以看到这个接口中有三个方法,其中iterator()方法可以给我们提供一个迭代器,这个在之前的教程就已经说过了,而forEach()方法提供了一个函数式接口的参数,我们可以使用lambda表达式结合来使用:

Collection<String> collection = ...;
collection.forEach(String s -> System.out.println(s));

这样就可以获取到每个值,它的底层实现是加强for循环,实际上也是迭代器去遍历,因为编译器会把加强for循环编译为迭代遍历。 Spliterator()1.8新加的方法,字面意思可分割的迭代器,不同以往的iterator()需要顺序迭代,Spliterator()可以分割为若干个小的迭代器进行并行操作,既可以实现多线程操作提高效率,又可以避免普通迭代器的fail-fast(fail-fast机制是java集合中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件)机制所带来的异常。Spliterator()可以配合1.8新加的Stream()进行并行流的实现,大大提高处理效率。具体的使用方法会在讲解Stream()的时候进行讲解。

Collection源码

接下来,我们来看一下Collection的源码,

public interface Collection<E> extends Iterable<E> {

    //1
    int size();

    //2
    boolean isEmpty();

    //3
    boolean contains(Object o);

    //4
    Iterator<E> iterator();

    //5
    Object[] toArray();

    //6
    <T> T[] toArray(T[] a);

    //7
    boolean add(E e);

    //8
    boolean remove(Object o);

    //9
    boolean containsAll(Collection<?> c);

    //10
    boolean addAll(Collection<? extends E> c);

    //11
    boolean removeAll(Collection<?> c);

    //12
    default boolean removeIf(Predicate<? super E> filter) {
        Objects.requireNonNull(filter);
        boolean removed = false;
        final Iterator<E> each = iterator();
        while (each.hasNext()) {
            if (filter.test(each.next())) {
                each.remove();
                removed = true;
            }
        }
        return removed;
    }

    //13
    boolean retainAll(Collection<?> c);

    //14
    void clear();

    //15
    boolean equals(Object o);

    //16
    int hashCode();

    //17
    @Override
    default Spliterator<E> spliterator() {
        return Spliterators.spliterator(this, 0);
    }

    //18
    default Stream<E> stream() {
        return StreamSupport.stream(spliterator(), false);
    }

    //19
    default Stream<E> `parallelStream`() {
        return StreamSupport.stream(spliterator(), true);
    }
}

可以看到,Collection()中提供了19个接口方法。接下来,我们来了解一下这些方法的作用:

  1. size(),返回当前存储在集合中的元素个数。
  2. isEmpty(),如果集合中没有元素,返回true。
  3. contains(Object obj),如果集合中包含了一个与obj相等的对象,返回true。
  4. iterator(),返回这个集合的迭代器。
  5. toArray(),返回这个集合的对象数组
  6. toArray(T[] arrayToFill),返回这个集合的对象数组,如果arrayToFill足够大,就将集合中的元素填入这个数组中。剩余空间填补null;否则,分配一个新数组,其成员类型与arrayToFill的成员类型相同,其长度等于集合的大小,并填充集合元素。
  7. add(Object element),将一个元素添加到集合中,如果由于这个调用改变了集合,返回true。
  8. remove(Object obj),从集合中删除等于obj的对象,如果有匹配的对象被删除,返回true。
  9. containsAll(Collection other),如果这个集合包含other集合中的所有元素,返回true。
  10. addAll(Collection other),将other集合中的所有元素添加到这个集合,如果由于这个调用改变了集合,返回true。
  11. removeAll(Collection other),从这个集合中删除other集合中存在的所有元素。如果由于这个调用改变了集合,返回true。
  12. removeIf(Predicate filter),从这个集合删除filter返回true的所有元素,如果由于这个调用改变了集合,则返回true。
  13. retainAll(Collection other),从这个集合中删除所有与other集合中的元素不同的元素。如果由于这个调用改变了集合,返回true。
  14. clear(),从这个集合中删除所有的元素。
  15. equals(Object o),如果两个集合对象相等返回true。
  16. hashCode(),返回该集合对象的哈希值。
  17. spliterator(),返回分割后的若干个小的迭代器。
  18. stream(),返回这个集合对于的流对象。
  19. parallelStream(),返回这个集合的并行流对象。

可以看到,作为第一级的集合接口,Collection提供了一些基础操作(增,删),并且可以通过实现Iterable接口获取一个迭代器去遍历获取集合中的元素。

下节预告

下节我们来讲AbstractCollction这个类,作为Collection的第一级子类,它又给我们提供了什么作用呢?

本文分享自微信公众号 - Vi的技术博客(viyoungblog),作者:ViYoung

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-10-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【两万字】面试官:听说你精通集合源码,接我二十个问题!

    这个图由Map指向Collection的Produces并不是说Map是Collection的一个子类(子接口),这里的意思是指Map的KeySet获取到的一个...

    山禾说
  • 十问泛型,你能扛住吗?

    使用泛型机制编写的代码要比那些杂乱的使用Object变量,然后再进行强制类型转换的代码具有更好的安全性和可读性,也就是说使用泛型机制编写的代码可以被很多不同类型...

    山禾说
  • Java基础系列(四十七):集合之AbstractMap

    亲爱的读者们,以后我每周更新两篇,周一更新基础底层,周五框架实战,上次投票的结果是JVM,我会在周一这一档等到基础系列完结后进行更新,周五目前更新的是sprin...

    山禾说
  • 不用临时的变量 优雅、高效的交换两个数方法

    到目前为止,我们的答题思路是没错的,就是寻找另外一种数据存储的模式,用一个变量保存两条信息的集合,我们仍然需要采用这种模式解决这个问题,但原先的简单相加的模式是...

    sunsky
  • 4.93Python数据类型之(8)集合

    py3study
  • Python中的集合

    Python中的集合专门用于存储信息,存储的元素无序且不能重复,它用一对花括号{}定义,数据之间用逗号隔开。

    阿黎逸阳
  • .Net多线程编程—并发集合

    并发集合 1 为什么使用并发集合? 原因主要有以下几点: System.Collections和System.Collections.Generic名称空间中所...

    甜橙很酸
  • Java 开发中如何正确的踩坑

    我们的做法是,要用最好的人。我一直都认为研发本身是很有创造性的,如果人不放松,或不够聪明,都很难做得好。你要找到最好的人,一个好的工程师不是顶10个,是顶100...

    好好学java
  • Javascript[0x09] -- 集合

    实现的时候一个巧妙的点,是使用对象而不是数组表示集合,我们知道Javascript中一个键只有一个值。

    丰臣正一
  • python-集合

    1 Set 定义:set可以用{}表示,但是不能用s{}这样定义,如果这样写,python编辑器会默认为是字典。

    py3study

扫码关注云+社区

领取腾讯云代金券