前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >jdk源码追踪-Collection

jdk源码追踪-Collection

作者头像
逝兮诚
发布2019-10-30 18:15:21
3380
发布2019-10-30 18:15:21
举报
文章被收录于专栏:代码人生代码人生

Collection

Collection接口是java最基础,重要的接口之一,它有ListSetQueue等Java最常用的子接口,这里主要解析Collection这个接口以及它最常用的类的源码实现。

在这里插入图片描述
在这里插入图片描述

上面是collection的类图

Collection是集合的父接口,它规约了集合有add(E e)remove(Object o)size()toArray()iterator()splitIterator()stream()这些基本操作。其中splitIterator()stream()是java8提供的新方法,stream()的作用是流式处理,它实现了lamda表达式;splitIterator()是分段的迭代器,满足支持多线程对Collection的遍历,而iterator()`是顺序的。

代码语言:javascript
复制
public interface Collection<E> extends Iterable<E> {
 
    int size();
    boolean isEmpty();
    boolean contains(Object o);
    Iterator<E> iterator();
    Object[] toArray();
    <T> T[] toArray(T[] a);
    boolean add(E e);
    boolean remove(Object o);
    boolean containsAll(Collection<?> c);
    boolean addAll(Collection<? extends E> c);
    boolean removeAll(Collection<?> c);
    
    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;
    }
    boolean retainAll(Collection<?> c);
    void clear();
    boolean equals(Object o);
    int hashCode();
    
    @Override
    default Spliterator<E> spliterator() {
        return Spliterators.spliterator(this, 0);
    }

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

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

stream()splitIterator()方法在Collection接口中是有默认实现的,这是java8的新语法,即接口方法也可以有默认实现,查看stream()源码可知,stream()采用的是分段迭代器,故而,它在多线程的效率会高。

代码语言:javascript
复制
default Spliterator<E> spliterator() {
    return Spliterators.spliterator(this, 0);
}
代码语言:javascript
复制
default Stream<E> stream() {
    return StreamSupport.stream(spliterator(), false);
}

在看Collection子类源码的时候,才发现java的实现真的遵守设计的想法

  • List是有序列,所有List有基于index的操作。
  • ArrayList是基于数组的实现,(所有的实现都基于数组,包括Iterator也是自己实现的内部类,next()实际是通过数组遍历得到),ArrayList适用于随机访问数据。
  • LinkedList是基于链表的实现,Iterator通过listIterator的实现迭代器。
  • Set是无序列,所以Set接口中没有对下标index的操作。

AbstractCollection

AbstractCollectionCollection实现类,也是所有Collection具体实现类的父类,它使用模版方法模式通过调用add()remove()等抽象方法实现了addAll()removeAll()retainAll()clear()toString()的算法。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-03-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

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