Collection接口

Collection表示一组称为其元素的对象,Collection接口用于传递需要最大通用性的对象集合,例如,按照惯例,所有通用集合实现都有一个带有Collection参数的构造函数,此构造函数(称为转换构造函数)初始化新集合以包含指定集合中的所有元素,无论给定集合的子接口或实现类型如何,换句话说,它允许你转换集合的类型。

例如,假设你有一个Collection<String> c,它可以是ListSet或其他类型的Collection,这个语法创建一个新的ArrayListList接口的一个实现),初始化包含c中的所有元素。

List<String> list = new ArrayList<String>(c);

或者 — 如果你使用的是JDK 7或更高版本 — 你可以使用菱形运算符:

List<String> list = new ArrayList<>(c);

Collection接口包含执行基本操作的方法,例如int size()boolean isEmpty()boolean contains(Object element)boolean add(E element)boolean remove(Object element)Iterator<E> iterator()

它还包含对整个集合进行操作的方法,例如boolean containsAll(Collection<?> c)boolean addAll(Collection<? extends E> c)boolean removeAll(Collection<?> c)boolean retainAll(Collection<?> c)void clear()

还存在用于数组操作的额外方法(诸如Object[] toArray()<T> T[] toArray(T[] a))。

在JDK 8及更高版本中,Collection接口还公开方法Stream<E> stream()Stream<E> parallelStream(),以从底层集合中获取顺序或并行流(有关使用流的更多信息,请参阅聚合操作的课程)。

如果Collection表示一组对象,Collection接口可以满足你的期望,它有告诉你集合中有多少元素(sizeisEmpty)的方法,检查给定对象是否在集合中的方法(contains),从集合中添加和删除元素的方法(addremove),和在集合上提供迭代器的方法(iterator)。

add方法的定义已经足够广泛,因此对于允许重复的集合以及不重复的集合都有意义,它保证Collection在调用完成后将包含指定的元素,并且如果Collection因调用而更改,则返回true。类似地,remove方法旨在从Collection中删除指定元素的单个实例,假设它包含要开始的元素,并且如果结果修改了集合则返回true

遍历集合

有三种遍历集合的方法:(1)使用聚合操作(2)for-each构造(3)通过使用Iterators

聚合操作

在JDK 8及更高版本中,迭代集合的首选方法是获取流并对其执行聚合操作,聚合操作通常与lambda表达式结合使用,以使编程更具表现力,使用更少的代码行,以下代码按顺序遍历一组形状并打印出红色对象:

myShapesCollection.stream()
.filter(e -> e.getColor() == Color.RED)
.forEach(e -> System.out.println(e.getName()));

同样,你可以轻松地请求并行流,如果集合足够大并且你的计算机具有足够的核心,这可能是有意义的:

myShapesCollection.parallelStream()
.filter(e -> e.getColor() == Color.RED)
.forEach(e -> System.out.println(e.getName()));

使用此API收集数据的方法有很多种,例如,你可能希望将Collection的元素转换为String对象,然后将它们连接起来,用逗号分隔:

String joined = elements.stream().map(Object::toString).collect(Collectors.joining(", "));

或者可以把所有员工的工资加起来:

int total = employees.stream()
.collect(Collectors.summingInt(Employee::getSalary)));

这些只是你可以使用流和聚合操作执行的一些示例,有关更多信息和示例,请参阅聚合操作的课程。

集合框架一直提供许多所谓的“批量操作”作为其API的一部分,这些包括对整个集合进行操作的方法,例如containsAlladdAllremoveAll等,不要将这些方法与JDK 8中引入的聚合操作混淆。新聚合操作与现有批量操作(containsAlladdAll等)之间的主要区别在于旧版本都是可变的,这意味着它们都修改了底层集合,相反,新的聚合操作不会修改底层集合。使用新的聚合操作和lambda表达式时,必须注意避免突变,以免在以后从并行流运行代码时引入问题。

for-each构造

for-each构造允许你使用for循环简明地遍历集合或数组 — 请参阅for语句,以下代码使用for-each构造在单独的行上打印出集合的每个元素。

for (Object o : collection)System.out.println(o);

迭代器

Iterator是一个使你可以遍历集合并需要时有选择地从集合中删除元素的对象,通过调用iterator方法获得集合的Iterator,以下是Iterator接口。

public interface Iterator<E> {boolean hasNext();E next();void remove(); //optional
}

如果迭代具有更多元素,则hasNext方法返回true,并且next方法返回迭代中的下一个元素,remove方法从底层Collection中删除next返回的最后一个元素,对next的每次调用只能调用remove方法一次,如果违反此规则则抛出异常。

请注意,Iterator.remove是在迭代期间修改集合的唯一安全方法,如果在迭代进行过程中以任何其他方式修改底层集合,则不指定此行为。

使用Iterator而不是for-each构造,当你需要:

  • 删除当前元素,for-each构造隐藏了迭代器,因此你无法调用remove,因此,for-each构造不可用于过滤。
  • 并行迭代多个集合。

以下方法说明如何使用Iterator过滤任意Collection — 即遍历集合删除特定元素。

static void filter(Collection<?> c) {for (Iterator<?> it = c.iterator(); it.hasNext(); )if (!cond(it.next()))it.remove();
}

这段简单的代码是多态的,这意味着无论实现如何,它都适用于任何Collection,此示例演示了使用Java集合框架编写多态算法是多么容易。

集合接口批量操作

批量操作对整个Collection执行操作,你可以使用基本操作实现这些简写操作,但在大多数情况下,此类实现效率较低,以下是批量操作:

  • containsAll — 如果目标Collection包含指定Collection中的所有元素,则返回true
  • addAll — 将指定Collection中的所有元素添加到目标Collection
  • removeAll — 从目标Collection中删除它们也包含在指定Collection中的所有元素。
  • retainAll — 从目标Collection中删除所有未包含在指定Collection中的元素,也就是说,它仅保留目标Collection中也包含在指定Collection中的那些元素。
  • clear — 从集合中删除所有元素。

如果在执行操作的过程中修改了目标Collection,则addAllremoveAllretainAll方法都返回true

作为批量操作功能的一个简单示例,请考虑以下语法,从Collection c中删除指定元素e的所有实例。

c.removeAll(Collections.singleton(e));

更具体地说,假设你要从Collection中删除所有null元素。

c.removeAll(Collections.singleton(null));

这个语法使用Collections.singleton,这是一个静态工厂方法,它返回一个只包含指定元素的不可变Set

集合接口数组操作

toArray方法是作为集合和旧API之间的桥梁提供的,这些API期望输入上的数组,数组操作允许将Collection的内容转换为数组,没有参数的简单形式创建一个新的Object数组,更复杂的形式允许调用者提供数组或选择输出数组的运行时类型。

例如,假设cCollection,以下代码段将c的内容转储到新分配的Object数组中,该数组的长度与c中的元素数相同。

Object[] a = c.toArray();

假设已知c只包含字符串(可能因为c的类型为Collection<String>),以下代码段将c的内容转储到新分配的String数组中,该数组的长度与c中的元素数相同。

String[] a = c.toArray(new String[0]);

上一篇:集合接口

下一篇:Set接口

Java™ 教程(Collection接口)相关推荐

  1. Java集合Collection接口中的常用方法演示

    Java集合Collection接口中的常用方法演示 添加 add(Objec tobj) 和 addAll(Collection coll) 获取有效元素的个数 int size() 清空集合 vo ...

  2. java.util (Collection接口和Map接口)

    1:Collection和Map接口的几个主要继承和实现类                  1.1  Collection接口 Collection是最基本的集合接口,一个Collection代表一 ...

  3. Java集合---Collection接口的常用方法

    Collection常用方法 size() 功能说明 返回当前集合中元素的总数量 代码实现 import java.util.ArrayList; import java.util.Collectio ...

  4. JAVA中Collection接口的方法

    以下是本人从API上复制的内容,只是方便自己查找记忆. compact1, compact2, compact3 java.util Interface Collection<E> pub ...

  5. java 集合 接口_Java集合之Collection接口

    1 - Java集合介绍 /* 1. 一方面, 面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象 的操作,就要对对象进行存储. 2. 另一方面,使用Array存储对象方面具有一些弊 端,而 ...

  6. Java 中 Comparable 接口的意义和用法.

    在之前的博文中已经介绍了Java中Collection 接口和 Collections类. http://blog.csdn.net/nvd11/article/details/21516075 一, ...

  7. java的set接口_Java集合-Set接口

    importorg.junit.Test;import java.util.*;/*** * Collection接口:单列集合,用来存储一个一个的对象 * (不常用)子接口Set:存储无序的.不可重 ...

  8. Collection接口共性方法

    java.util.Collection接口所有单列集合的最顶层的接口,里边定义了所有单列集合共性的方法任意的单列集合都可以使用Collection接口中的方法共性的方法:public boolean ...

  9. Java集合框架系列教程三:Collection接口

    翻译自:The Collection Interface 一个集合表示一组对象.Collection接口被用来传递对象的集合,具有最强的通用性.例如,默认所有的集合实现都有一个构造器带有一个Colle ...

最新文章

  1. h桥控制电机刹车_控制直流电机正反转以及刹车电路设计 (转载)
  2. 猜一个介于1-10之间的数字,反复执行直到猜中为止
  3. 如何汉化DNN--中文语言包的使用
  4. html vw自动跳到ie,CSS3动画/关键帧,在IE11问题中使用vw进行转换
  5. [thinkphp] 是如何输出一个页面的
  6. Java开发环境!java基础知识点总结
  7. Matlab符号数学(Symbolic Math with MATLAB)MATLAB解方程
  8. Activity管理类,随时随地退出应用程序
  9. python中使用连续关系运算符_解释一下Python中的关系运算符
  10. java clone()用法_java clone方法使用详解(转)
  11. java p2p实例_java文件p2p传输
  12. ERR_BLOCKED_BY_CLIENT - 请求被广告拦截插件拦截
  13. 计算机启动dos,开机怎么进入dos_开机怎么进入dos界面
  14. postman创建mockserver
  15. 【史上最全】常用USB转串口芯片特性比较
  16. 金秋10月,结婚的季节啊-参加同学婚宴安排
  17. 2020年高教社杯全国大学生数学建模竞赛题目D题 接触式轮廓仪的自动标注
  18. 安卓实现浏览器app
  19. 八种常见排序算法细讲
  20. SpringCloud服务治理Eureka(理论)

热门文章

  1. 英特尔首款AI芯片终于发布:训练推理两用,历时4年花费5亿美元买来4家公司...
  2. 实用ExtJS教程100例-009:ExtJS Form无刷新文件上传
  3. MyEclipse10安装SVN插件
  4. python基础第二天(day14)
  5. CentOS 漏洞修补
  6. 韩寒:出了国才知道,外国是多么的落后(写的真委婉~不愧是韩寒)
  7. matplot画图控制marker点的个数_S7-1200运动控制
  8. 云网融合 — 云网业务统一管控技术
  9. Linux Kernel TCP/IP Stack — L1 Layer — NIC Controller — Buffer descriptor table
  10. stm32实际运用中遇到的问题