前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java基础系列(三十九):集合之Collection

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

作者头像
山禾说
发布2019-01-21 10:11:59
4640
发布2019-01-21 10:11:59
举报
文章被收录于专栏:Vi的技术博客Vi的技术博客

框架图

-w152

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

代码语言:javascript
复制
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表达式结合来使用:

代码语言:javascript
复制
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的源码,

代码语言:javascript
复制
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的第一级子类,它又给我们提供了什么作用呢?

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-10-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Vi的技术博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档