「译」Java集合框架系列教程三:Collection接口

原文:The Collection Interface

译文:Java集合框架系列教程三:Collection接口

一个集合表示一组对象。Collection接口被用来传递对象的集合,具有最强的通用性。例如,默认所有的集合实现都有一个构造器带有一个Collection类型参数。这个构造器被称作转换构造器,用指定集合的元素来初始化新集合,而不管指定集合实现的是哪个集合接口和实现类型。换句话说,这个构造器使得我们可以转化集合的类型(比如List到Set,Set到List)。

设想一下,假如你有一个Collection<String> c,它可能是一个List,也可能是一个Set,或者其他类型的Collection。按照上面的方法可以这样初始化一个ArrayList包含c中所有元素:

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

下面是Collection接口实现:

public interface Collection<E> extends Iterable<E> {
    // Basic operations
    int size();
    boolean isEmpty();
    boolean contains(Object element);
    // optional
    boolean add(E element);
    // optional
    boolean remove(Object element);
    Iterator<E> iterator();

    // Bulk operations
    boolean containsAll(Collection<?> c);
    // optional
    boolean addAll(Collection<? extends E> c); 
    // optional
    boolean removeAll(Collection<?> c);
    // optional
    boolean retainAll(Collection<?> c);
    // optional
    void clear();

    // Array operations
    Object[] toArray();
    <T> T[] toArray(T[] a);
}

这个接口做了我们期望一组对象能做的事情。这个接口通过size、isEmpty方法来告诉我们集合中还有多少元素。通过contains方法来判断给定元素是否在集合中。通过add、remove方法来添加或移除元素。并且提供iterator方法来迭代访问集合。

add方法足够泛化,使得它既支持允许重复元素的集合,又支持不允许重复元素的集合。它保证集合在调用add方法后将包含指定元素,并且返回true,如果集合在调用add之后改变了。类似地,remove方法用来从集合中移除指定元素,前提是集合包含这个元素,并且返回true如果调用remove方法之后集合改变了。

遍历集合

有两种方法遍历集合:

  • for-each
  • 迭代器访问

fo-each:

for-each访问如下:

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

迭代器访问:

一个迭代器使得我们可以遍历集合并且可以有选择性地移除集合中的某些元素。我们可以通过调用集合的iterator方法来获得集合的迭代器。下面是Iterator接口:

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

hasNext方法指示集合中是否还有元素,next返回迭代中的下一个元素。remove方法移除next返回的元素。每调用一次next,最多只能调用一次remove,否则会抛出异常。比如下面代码遍历集合a,并且删除它的所有元素:

List<String> a = new ArrayList<String>();
a.add("hello");
a.add("world");
Iterator<String> iter = a.iterator();
while(iter.hasNext()) {
   System.out.print(iter.next() + "\t");
   iter.remove();
 }

上面如果把iter.remove放到iter.next()之前,就会抛出java.lang.IllegalStateException异常。

注意Iterator.remove是遍历集合期间修改集合的唯一安全方法。如果在遍历集合期间用其他方法修改集合,会发生难以预料的事情。

使用迭代器而非for-each当你需要做下面的事情时: - 移除当前元素。for-each不是用来过滤集合中元素的好方法。应该用iterator来过滤集合中的元素,代码如下:

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

这段简单的代码体现了多态,这意味着它可以支持所有的集合,而不管它的具体实现如何。这个例子也证明了利用Java集合框架编写多态算法是多么的简单。

集合接口批量操作

批量操作对整个集合进行某种操作。我们可以采用其他的基本操作实现对整个集合的操作,虽然那样做可能不够高效。下面是集合接口支持的批量操作:

  • containsAll — 返回true,如果集合包含指定集合中的所有元素
  • addAll — 将指定集合中的所有元素添加到目标集合中
  • removeAll — 从目标集合中移除所有也在指定集合中存在的元素,即从目标集合中移除交集元素
  • retainAll — 只保留目标集合和指定集合都含有的元素,即交集元素。如果执行retainALl操作后,目标集合被修改,则返回true。那么什么时候返回false呢?当目标集合含有的元素与指定集合完全一样时。
  • clear - 清空目标集合中的所有元素。

上面几个方法返回true,当目标集合在执行这些方法之后被修改了。

举一个简单的例子来证明批量操作的威力,考虑下面的代码,它用来从集合中移除指定元素e:

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

再举一个更加特殊的例子,如果你想移除集合中的所有null元素:

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

这里使用了Collections.singleton,这是一个静态工厂方法,返回结果是一个只包含指定元素的不变Set。

集合接口的数组操作

toArray方法被用来沟通collections和旧API(期望一个数组作为输入)。数组操作使得集合被转换为数组。不带任何参数的toArray方法创建一个对象的新数组。更复杂的形式允许指定一个数组参数或者为返回结果选择一个运行时类型。

例如,设想c是一个Collection。下面的代码将c的内容填充到一个新开辟的对象数组中,这个数组的长度等于c的元素数目:

Object[] a = c.toArray();

又假设c只包含字符串,即Collection<String> c。那么下面的代码将返回一个字符串数组,数组的长度还是等于c的元素数目:

String[] a = c.toArray(new String[0]);
Java集合01:初识集合以及Collection接口方法详解 初识集合以及Collection接口的方法进行详解 阅读详情

相关推荐

python——模拟砍价

类型:随机数。

m0_62488776的博客 1970

retainall java_瞬间教你学会使用java中list的retainAll方法

retainAll方法简介当我们有两个list集合的时候,我们可以使用retainAll方法求得两个list集合的子集。retainAll是Collection接口中提供的一个方法,各个实现类有自己的实现方式,我们这里介绍ArrayList的实现方式。retainAll源码深入可以看到collection接口中的retainAll方法,需要传入一个集合。boolean retainAll(Coll...

weixin_35106463的博客 1188

STM32F407用FSMC+DMA驱动LVGL,3.5寸屏流畅度翻倍实战(附CubeMX配置避坑)

本文详细介绍了如何在STM32F407上通过FSMC+DMA驱动LVGL,显著提升3.5寸屏的显示流畅度。从FSMC与DMA的配置原理到LVGL驱动层适配,提供了完整的优化方案和实测数据,帮助开发者解决界面卡顿问题,实现流畅度翻倍的效果。

weixin_30872499的博客 559

retainAll()方法

如果集合A的大小没有发生改变,返回false,即使两个集合完全相同,也会返回false。如果集合A的大小发生了改变,返回true,即使两个集合完全没有交集,也会返回true。这个方法的作用就是将A与B的交集存放在A中。

weixin_43735255的博客 2385

Win11/Win10系统下,Proe5.0 M280终极版保姆级安装与激活指南(含SSQ补丁避坑)

本文提供Win11/Win10系统下Pro/E 5.0 M280终极版的详细安装与激活指南,涵盖环境配置、SSQ补丁应用及常见问题解决方案。通过系统调整、分步安装和性能优化,确保软件在现代操作系统上的稳定运行,特别适合机械设计用户参考。

weixin_30895059的博客 441

ESP32-S3 USB下载模式深度解析:从UART0到TinyUSB的硬件设计与避坑指南

本文深度解析ESP32-S3的三种USB下载模式:UART0、Hardware CDC和基于TinyUSB的USB-OTG CDC。详细探讨各模式的硬件设计要点、电平异常问题、eFuse配置及避坑指南,帮助开发者优化设计,提升量产效率和系统稳定性。

gold的博客 1288

Java List retainAll方法使用注意事项

我们知道在Java中求两个集合的交集可以使用List 的retainAll方法 List<String> strList1 = new ArrayList<>(); List<String> strList2 = new ArrayList<>(); strList1.add("1"); strList1.add("2"); strList2.add...

ChlatZed的博客 4038

silvaco(TCAD)击穿特性仿真,的不收敛问题

在silvaco仿真学习过程中,最近这段时间一直有一个很大的问题困扰着我,那就是我在仿真击穿特型曲线的过程中,在电压加到后期比较大的情况下,往往会出现仿真不收敛的情况,正常情况下器件的击穿应该在一个外加偏压上,电流出现迅速的上升,这才是击穿的定义,但是我仿真的过程中程序跑到一个较大的电压时,器件出现击穿,我观察电压电流曲线,在击穿电压(程序报告的)电流并没有出现迅速的变化,类似于下图这种形式。(2)解决方法,将初始电压调整到合适的值,这个值可能是更大的也可能是更小的,要注意多多尝试。

zm19992533002908的博客 4944

【JavaSE系列】Java集合框架之Collection,Map接口

本篇文章带大家认识Java基础知识——集合框架,从本篇文章开始正式拉开数据结构的序幕,要深入了解一件事,那必然先得见个面,本文带大家认识Java集合框长什么样,以及怎么使用Collection和Map接口。

未见花闻的博客 1832

YOLOv11多模态融合实战:基于YOLOFuse的RGB与红外线(IR)协同检测技术解析

本文深入解析了基于YOLOv11的YOLOFuse多模态融合技术,重点探讨了RGB与红外线(IR)协同检测的实现原理与实战应用。文章详细介绍了双流架构与数据级、特征级、决策级三种融合策略,并通过实战案例展示了其在低光照、复杂环境下显著提升检测精度与鲁棒性的优势,为全天候安防、自动驾驶等场景提供了有效的技术解决方案。

weixin_29041195的博客 649

基于STM32L4XX、HAL库的TESEO-LIV4FTR定位模块驱动程序设计

支持多星座系统:GPS、GLONASS、Galileo和北斗。支持NMEA 0183协议和ST专有协议。高灵敏度:-167dBm跟踪灵敏度。低功耗设计,适合物联网和便携设备。内置LNA和SAW滤波器。

zhusl6688的博客 237

java集合之——Collection接口

前言 老师在教我们学习集合的时候,大多都是以数组为砖,列举了对象数组有那些问题?比如普通的对象数组的最大问题在于数组中的元素个数是固定的,不能动态的扩充大小,所以最早的时候可以通过链表实现一个动态对象数组。但是这样做毕竟太复杂了,所以在 Java 中为了方便用户操作各个数据结构,所以引入了类集的概念,有时候就可以把类集称为 java 对数据结构的实现。 在整个类集中的,这个概念是从 JDK 1.2(Java 2)之后才正式引入的,最早也提供了很多的操作类,但是并没有完整的提出类集的完整概念。 类集中最大的几

you do ,you win 4310

FCTA/FCTB 前方交通穿行预警/制动系统技术规范

FCTA&FCTB前方交叉路口预警制动系统是针对十字路口和停车场等"鬼探头"场景设计的驾驶辅助系统。系统在自车速度0-40km/h范围内工作,通过角雷达和摄像头检测侧向来车.

未知艺术家的博客 738

Java集合类之Collection接口,集合的“爸爸”接口了解一下?

目录什么是集合?集合在数组有什么区别?Collection接口如何遍历集合中的元素 Hello!没技术的大灰狼又来了,今天和小伙伴分享一个Java项目开发中比较常用的存储数据的方法----集合。 想到集合,可能很多小伙伴都会想到数组,那么集合和数组又有什么样的区别呢?且听大灰狼一一分解哟! . 什么是集合? 在Java中,集合可以看做是一个容器,如它可以是一个衣柜,里面装满了不同的衣服;它也可以是一个书柜,里面塞满了各种各样不同的书籍,我们可以随时的将它们取出或者放入,并且可以按照一定的顺序存放这些在容器中

累计发表博客60余万字,优快云 博客专家、Java 领域优质创作者、华为云享专家、阿里云专家博主。专注分享 Java 优质文章,毕设实战项目开发,全网粉丝10W+ 6426

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

java中集合框架详解之Collection集合

不再考虑equals() 和 hashCode()方法了,即添加到TreeSet中的元素所在的类不需要重写 equals() 和 hashCode()。原因:因为Collection中的相关方法(比如contains() / remove())在使用中,要调用元素所在类的equals().比较元素的大小或比较元素是否相等的标准就是考虑自然排序或定制排序中,compareTo()和compart()的返回值。比较的标准,需要判断hashCode()得到的哈希值以及equals()得到的boolean型结果。

weixin_45535916的博客 1850

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Java集合:Collection接口

Collection是一个接口,继承自Iterable。我们先看一下Iterable接口的源码 一、Iterable package java.lang; import java.util.Iterator; import java.util.Objects; import java.util.Spliterator; import java.util.Spliterators; import java.util.function.Consumer; /** *实现这个接口的的类允许使

栗筝i的博客 3417

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java 集合框架(Collection)

这个方法允许你指定数组的类型,并且可以避免类型转换的开销。相关的方法,当然,Collection的功能List也都继承了。1.LinkedList集合的底层是基于什么实现的?① 如果集合支持索引,可以使用for循环遍历,每删除数据后做。获取集合的迭代器对象,对迭代器对象使用.next()方法。基于双链表的这种特点,LinkedList新增了很多。写累了,承受了这个年纪不该承受的(惆怅脸)…函数式接口的实现,这个实现可以是一个。就是removeFirst方法的套皮,来实现的,但隐藏了迭代器的实现细节。

m0_70484213的博客 1169

Java集合总结之Collection整体框架

前段时间一直在忙一个物联网的项目,所以Java的学习一直搁置,从今天开始继续学习!望大家多提宝贵意见!         java.util包中包含了一些在Java 2中新增加的最令人兴奋的增强功能:类集。一个类集(collection)是一组对象。类集的增加使得许多java.util中的成员在结构和体系结构上发生根本的改变。它也扩展了包可以被应用的任务范围。Java的类集(Collection)

被赶的蜗牛的专栏 4万+

Collection集合框架

java的集合框架 java.util.Collection接口 Collection是所有集合的顶级接口,里面规定了集合操作元素的相关功能方法集合与数组一样,用于存储一组元素,但是集合又多个不同的实现类来实现不同的数据结构 Collection下面有两个常见的值接口 java.util.List:线性表,特点:可以存放重复元素并且有序,可以通过下标操作 java.util.Set:不可以重复的集合 这里的重复元素判定是依靠元素自身equals方法比较的结果而定 List常见的实

qi15689782508的博客 3321

【Java】—— 集合框架:Collection接口中的方法与迭代器(Iterator)

一方面,面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储。另一方面,使用数组存储对象方面具有一些弊端,而Java 集合就像一种容器,可以动态地把多个对象的引用放入容器中。数组在内存存储方面的特点数组初始化以后,长度就确定了。数组中的添加的元素是依次紧密排列的有序的,可以重复的。数组声明的类型,就决定了进行元素初始化时的类型。不是此类型的变量,就不能添加。可以存储基本数据类型值,也可以存储引用数据类型的变量数组在存储数据方面的弊端数组初始化以后,长度就不可变了,

weixin_63106307的博客 1368

Java集合--->Collection接口

/**一、集合框架的概述 * 1.集合、数组都是对多个数据进行存储操作的结构,简称Java容器。 * 说明:此时的存储,主要指的是内存层面的存储,不涉及到持久化的存储(.txt,.jpg,.avi,数据库中) * 2.1 数组在存储多个数据方法的特点: * > 一旦初始化以后,其长度就确定了。 * > 数组一旦定义好,其元素的类型也就确定了。我们也就只能操作指定类型的数据了。 * 比如:String[] arr;int[] arr1;Object[].

weixin_49329785的博客 1676

Java集合---Collection接口和Map接口

Java集合框架主要分为三大类:Collection接口 - 存储单个元素的集合Map接口 - 存储键值对的集合队列 - 特殊的集合类型。

m0_74230209的博客 1158

JavaSE——集合1:Collection接口

JavaSE——集合1:Collection接口—Iterator和增强for遍历集合

雷神乐乐的博客 928
上一篇: 「译」Java集合框架系列教程二:集合接口
下一篇: web.py 0.3 新手指南 - FAQ
SleepInDelphi
博客等级 码龄19年 32粉丝 388原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值