本文我们主要学习Java集合框架的根接口Collection,通过本文我们可以进一步了解Collection的属性及提供的方法。在介绍Collection接口之前我们不得不先学习一下Iterable,因为Collection接口继承了它。

Collection接口类图

从类图中我们看到Collection接口继承了Iterable接口

Iterable源码分析

由类图我们可以发现,Iterable接口有三个方法,其中两个方法使用default修饰的,这是jdk1.8的新特性,允许接口中有默认实现方法,其实现类中可以有选择的重写这部分方法,下面我们看一下每个方法的作用是什么:

#返回元素类型为T的迭代器,有了这个迭代器就可以对集合中元素进行遍历
Iterator<T> iterator();#遍历集合中的元素并对元素进行执行操作,直到遍历完成或抛出异常
default void forEach(Consumer<? super T> action) {Objects.requireNonNull(action);for (T t : this) {action.accept(t);}
}#Spliterator(splitable iterator可分割迭代器),对集合进行并行遍历
default Spliterator<T> spliterator() {return Spliterators.spliteratorUnknownSize(iterator(), 0);
}

Iterable接口总结:

默认为所有集合类添加了两个方法,

一个是遍历并处理集合元素

一个是可分割迭代器,与方法iterator相比,一个是顺序遍历,一个是并行遍历

Collection接口源码分析

    //查询操作,以下方法属于查询操作#返回集合中元素数量,如果元素数量大于Integer.MAX_VALUE将返回Integer.MAX_VALUEint size();#如果集合中没有元素,将返回true,否则返回falseboolean isEmpty();#如果集合中包含指定的元素,则返回true,否则falseboolean contains(Object o);#返回该集合中元素的迭代器。对于返回元素的顺序,没有任何保证。Iterator<E> iterator();#如果此集合对其迭代器返回的元素的顺序有任何保证,则该方法必须以相同的顺序返回元素。#这个方法必须分配一个新数组,即使这个集合是由数组组成的。#这个方法充当集合与数组之间转换的桥梁Object[] toArray();#返回一个包含集合中所有元素的数组#如果集合中的元素类型与指定数组类型相匹配则直接按照元素中数组类型返回#否则,将使用指定数组的运行时类型和该集合的大小分配新的数组。#如果此集合对其迭代器返回的元素的顺序有任何保证,则该方法必须以相同的顺序返回元素。#T:返回数组的类型#a:如果该数组足够大可以容纳集合中所有元素,则使用该数组存储,否则将根据集合大小和元素类型重新创建一个数组<T> T[] toArray(T[] a);// 修改操作,以下方法属于修改操作#向集合中添加元素,如果该元素在集合中已经存在则返回false,否则返回true#集合本身对添加的元素会有所限制,比如有些集合拒绝添加nullboolean add(E e);#从集合中删除指定元素,如果指定的元素存在集合中并完成了删除操作,则返回trueboolean remove(Object o);// 批量操作#如果集合中包含指定的所有元素,则返回trueboolean containsAll(Collection<?> c);#将指定集合中的所有元素添加到此集合#如果在运行过程中修改指定的集合,则该操作的行为是未定义的boolean addAll(Collection<? extends E> c);#从当前集合中移除指定集合中的所有元素boolean removeAll(Collection<?> c);# @since 1.8#删除该集合中满足给定谓词的所有元素#在迭代期间抛出的任何异常都会传递给调用者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();// 比较和散列#比较指定对象与当前集合是否相等#@see Object#equals(Object)#@see Set#equals(Object)#@see List#equals(Object)boolean equals(Object o);#@see Object#hashCode()#@see Object#equals(Object)#返回当前对象的哈希值int hashCode();#@since 1.8#创建一个集合的并行迭代器@Overridedefault Spliterator<E> spliterator() {return Spliterators.spliterator(this, 0);}#@since 1.8#将当前集合作为数据源,创建一个序列流default Stream<E> stream() {return StreamSupport.stream(spliterator(), false);}#@since 1.8#将当前集合作为数据源,创建一个可并行计算的序列流default Stream<E> parallelStream() {return StreamSupport.stream(spliterator(), true);}

转载于:https://www.cnblogs.com/liukaifeng/p/10052643.html

Java集合框架之接口Collection源码分析相关推荐

  1. Java集合框架之三:HashMap源码解析

    Java集合框架之三:HashMap源码解析 版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! HashMap在我们的工作中应用的非常广泛,在工作面试中也经常会被问到,对于这样一个重要的集 ...

  2. 【集合框架】JDK1.8源码分析之HashMap(一)

    转载自  [集合框架]JDK1.8源码分析之HashMap(一) 一.前言 在分析jdk1.8后的HashMap源码时,发现网上好多分析都是基于之前的jdk,而Java8的HashMap对之前做了较大 ...

  3. 【集合框架】JDK1.8源码分析之IdentityHashMap(四)

    一.前言 前面已经分析了HashMap与LinkedHashMap,现在我们来分析不太常用的IdentityHashMap,从它的名字上也可以看出来用于表示唯一的HashMap,仔细分析了其源码,发现 ...

  4. 【集合框架】JDK1.8源码分析HashSet LinkedHashSet(八)

    一.前言 分析完了List的两个主要类之后,我们来分析Set接口下的类,HashSet和LinkedHashSet,其实,在分析完HashMap与LinkedHashMap之后,再来分析HashSet ...

  5. 3.Java集合-HashSet实现原理及源码分析

    一.HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持,它不保证set的迭代顺序很久不变.此类允许使用null元素 二.HashSet的实现: 对于Ha ...

  6. Android-FixBug热修复框架的使用及源码分析(不发版修复bug)

    前面几篇博文已经介绍了2种热修复框架的使用及源码分析,AndFix兼容性比较好,而Dexposed Art处于Beta版. AndFix和Dexposed都是阿里的开源项目.  Alibaba-And ...

  7. Java集合框架概述及Collection接口方法讲解

    Java集合框架概述 一方面, 面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象 的操作,就要对对象进行存储.另一方面,使用Array存储对象方面具有一些弊 端,而Java 集合就像一种容 ...

  8. java集合框架的接口_Java集合框架之Collection接口详解

    Java是一门面向对象的语言,那么我们写程序的时候最经常操作的便是对象了,为此,Java提供了一些专门用来处理对象的类库,这些类库的集合我们称之为集合框架.Java集合工具包位于Java.util包下 ...

  9. C# list集合 重复元素 索引_源码分析专题10-纯手写JDK不同版本下的List接口

    纯手写集合框架(下一篇:LinkeList原理) 集合框架介绍 说明:对于以上的框架图有如下几点说明 1.所有集合类都位于java.util包下.Java的集合类主要由两个接口派生而出:Collect ...

最新文章

  1. 和lock一起学beego 博客系统开发为例(六)
  2. SSL 1052——开心的金明
  3. 数据流中的第k大元素的golang实现
  4. 将STM32的标准库编译成lib
  5. lenovo vantage工具栏无反应 电池图标单击无法显示状态栏
  6. 特斯拉最安全的车_特斯拉现在是最受欢迎的租车选择
  7. **Java有哪些悲观锁的实现_「Java并发编程」何谓悲观锁与乐观锁,Java编程你会吗...
  8. php获取站点的根目录和站点的根URL
  9. 一段.net 发邮件的代码
  10. 29.奖金(拓扑排序)
  11. 目标检测中常见指标 AP MAP coco Pascal voc 评价指标说明
  12. 分数阶微积分学薛定宇电子版_分数阶微积分及应用.pdf
  13. 爬虫爬出来的数据不全_Web Scraper教程(二)爬虫入门之当当畅销书爬取
  14. 紫书 UVa437巴比伦塔
  15. 每日新闻:国美与车势达成独家战略合作;腾讯Tsrc年度峰会破界召开;日本将允许高度自动驾驶车上路;“开源芯片”是芯片发展的新潮流...
  16. React实现微信公众号支付
  17. 旋度的散度恒为0(公式推导)
  18. Java中文乱码破碎重组_Java 关于中文乱码问题的解决方案与经验
  19. 一次项目开发中,收获的经验和教训
  20. a标签 :focus的使用(:focus)

热门文章

  1. 【js】数组的splice方法和slice方法的区别
  2. ORACLE学习之绑定变量
  3. 不能因技术后天的死 而迷茫了今天的“学” 生
  4. winlogon病毒清除
  5. Linux命令备忘实例——排序和基本统计命令
  6. 蓝桥杯 ADV-154 算法提高 质数的后代
  7. [Java] 蓝桥杯ALGO-122 算法训练 未名湖边的烦恼
  8. 【操作系统】存储器管理01-思维导图
  9. 通过yum install 方式安装snmp包遇到的问题,gsk7bas64-7.0-4.44.x86_64 has missing libstdc++.so.*等
  10. IE8 Beta2 已经放出来了