《Java核心技术 卷I》Collection接口和迭代器

Collection接口

Java类库中,集合类的基本接口是Collection接口,两个基本方法:

public interface Collection<E>{
    boolean add(E element);
    Iterator<E> iterator();
    ......
}

add方法用于向集合中添加元素,如果元素确实改变了集合就返回true,否则没有变化就是false。

iterator方法用于返回一个实现了Iterator接口的对象,使用迭代器对象依次访问集合中的元素。

迭代器

Iterator接口包含4个方法:

public interface Iterator<E>{
    E next();
    boolean hasNext();
    void remove();
    default void forEachRemaining(Consumer<? super E> action)
}

通过反复调用next方法,可以逐个访问集合中的每个元素,但是到达集合的末尾,next方法将抛出一个NoSuchElementException,因此需要在调用next之前调用hasNext方法,如果迭代器对象还有多个可以访问的元素,这个方法就返回true,如果想要查看集合的所有元素,就请求一个迭代器,当hasNext返回true时就反复的调用next方法,例如:

Collection<String> c = ...;
Iterator<String> iter = c.iterator();
while(iter.hasNext()){
    String element = iter.next();
    //用元素做些什么
}

或者用foreach简练表示循环:

for(String element : c){
    //用元素做些什么
}

foreach可以处理任何实现了Iterable接口的对象,这个接口只包含一个抽象方法:

public interface Iterable<E>{
    Iterator<E> iterator();
}

Collection接口拓展了Iterable接口,因此,任何标准库中的任何集合都可以使用foreach。

不写循环,可以调用forEachRemaining方法并提供一个lambda表达式(会处理一个元素),将对迭代器的每一个元素调用这个lambda表达式,直到再没有元素为止。

iterator.forEachRemaining(element -> do something with element);

访问顺序,ArrayList从索引0开始,自增1,访问HashSet是随机顺序,但能遍历所有元素,对于计算等也不重要。

注释:Iterator和Enumeration接口方法作用一样,但后者名字累赘,引入了较短方法名的新接口。

可以认为Java迭代器位于两个元素之间,当调用next时,迭代器就越过下一个元素,并返回刚刚越过的那个元素的引用。

注释:这里有一个推论,可以将Iterator.next与InputStream.read看成等效的,从数据流中读取一个字节,就会自动地消耗掉这个字节,下一次调用read将会消耗并返回输入的下一个字节。

Iterator接口的remove方法将会删除上次调用next方法时返回的元素,想要删除指定位置的元素,仍然要越过这个元素。

Iterator<String> it = c.iterator();
it.next();
it.remove();

next方法和remove方法调用之间存在依赖性,如果调用remove之间没有调用next,将是不合法的,抛出IllegalStateException异常。

想删除相邻的两个元素,不能这样调用:

it.remove();

it.remove();

必须先调用next越过将要删除的元素。

it.remove();

it.next();

it.remove()

泛型实用方法

由于Collection与Iterator都是泛型接口,意味着你可以编写处理任何集合类型的使用方法,例如,检测任意集合是否包含指定元素的泛型方法:

public static <E> boolean contains(Collection<E> c,Object obj){
    for(E e : c){
        if(e.equals(obj)) return true;
        return false;
    }
}

Java类库设计者认为,这些实用方法中有一些非常有用,应该给它们提供给用户使用,这样,类库使用者就不必自己重新构建这些方法了,contains就是这样一个使用方法。事实上,Collection接口声明了很多有用的方法,所有的实现类必须提供这些方法,下面列举其中的一部分:

int size()
boolean isEmpty()
boolean contains(Object obj)
boolean containsAll(Collection<?> c)
boolean equals(Object other)
boolean addAll(Collection<? extends E> from)
boolean remove(Object obj)
boolean removeAll(Collection<?> c)
void clear()
boolean retainAll(Collection<?> c)
Object[] toArray()
<T> T[] toArray(T[] arrayToFill)

当然,如果实现Collection接口的每一个类都要提供如此多的例行方法,这很烦人,为了更容易实现这个接口,Java类库提供了一个类AbstractCollection,保持基础方法size和iterator为抽象方法,实现了其他的方法。

具体集合类可以拓展这个抽象类,提供迭代器方法,contains方法也由超类实现,若由不同需求或更高效,可以重写。

这种做法已经过时,这些方法最好是Collection接口的默认方法,但实际不是这样,不过增加了很多流处理相关的方法。还有一个有用的方法:

default boolean removeIf(Predicate filter),用于删除满足某个条件的元素。

java.util.Collection 1.2

  • Iterator iterator(),返回访问集合的各个元素的迭代器。
  • int size(),返回当前存储在集合中的元素个数。
  • boolean isEmpty(),如果集合没有元素,返回true。
  • boolean contains(Object obj),集合是否包含某元素。
  • boolean containsAll(Collection c),集合是否包含某集合。
  • boolean add(E element),添加元素到集合中,改变了集合,返回true。
  • boolean addAll(Collection other),将集合添加到本集合中。
  • boolean equals(Object other),重写相等方法
  • boolean remove(Object obj),从集合中删除对象
  • boolean removeAll(Collection c),删除某集合中的元素
  • default boolean removeIf(Predicate filter),8,有则删除
  • void clear(),清空集合
  • boolean retainAll(Collection c),删除与参数集合不同的元素。
  • Object[] toArray(),集合中元素以数组形式返回。
  • T[] toArray(T[] arrayToFill),参数数组大时,将本集合填入剩余空间填null,若小,分配新数组,类型与参数数组相同,长度是集合长度,填充元素。

java.util.Iterator 1.2

  • boolean hasNext(),存在可访问元素,返回true。
  • E next(),返回想要访问的下一个对象,到达集合尾部,抛出异常。
  • void remove(),删除上次访问的对象,与上一个方法配合使用,若已被删除或者没有元素,则抛出异常。
  • default void forEachRemaining(Consumer action) 8,访问剩余元素,并传递指定动作,直到没有更多元素或者动作抛出异常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/919070.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《Python制作动态爱心粒子特效》

一、实现思路 粒子效果&#xff1a; – 使用Pygame模拟粒子运动&#xff0c;粒子会以爱心的轨迹分布并运动。爱心公式&#xff1a; 爱心的数学公式&#xff1a; x16sin 3 (t),y13cos(t)−5cos(2t)−2cos(3t)−cos(4t) 参数 t t 的范围决定爱心形状。 动态效果&#xff1a; 粒子…

109. UE5 GAS RPG 实现检查点的存档功能

在这一篇文章里&#xff0c;我们接着实现存档的功能&#xff0c;保存当前玩家的生成位置&#xff0c;游戏里有很多中方式去实现玩家的位置存储&#xff0c;这里我们采用检查点的方式&#xff0c;当玩家接触到当前检查点后&#xff0c;我们可以通过检查点进行保存玩家的状态&…

浅谈电力行业网络安全与防护

3月7日&#xff0c;委内瑞拉发生迄今为止最大规模停电事件&#xff0c;让这个身处危机之中的国家雪上加霜。千里之堤溃于蚁穴&#xff0c;切莫忽视任何不安全因素的存在。电力基础设施薄弱&#xff0c;设备维护不到位&#xff0c;技术人员水平低下&#xff0c;工业控制系统防护…

UE5 第一人称射击项目学习(一)

因为工作需要&#xff0c;需要掌握ue5的操作。 选择了视频资料 UE5游戏制作教程Unreal Engine 5 C作为学习。 第一个目标是跟着视频制作出一款第一人称射击项目。 同时作为入门&#xff0c;这个项目不会涉及到C&#xff0c;而是一个纯蓝图的项目。 项目目标 这个项目将实…

Excel数据动态获取与映射

处理代码 动态映射 动态读取 excel 中的数据&#xff0c;并通过 json 配置 指定对应列的值映射到模板中的什么字段上 private void GetFreightFeeByExcel(string filePath) {// 文件名需要以快递公司命名 便于映射查询string fileName Path.GetFileNameWithoutExtension(fi…

博客文章怎么设计分类与标签

首发地址&#xff08;欢迎大家访问&#xff09;&#xff1a;博客文章怎么设计分类与标签 新网站基本上算是迁移完了&#xff0c;迁移之后在写文章的过程中&#xff0c;发现个人的文章分类和标签做的太混乱了&#xff0c;分类做的像标签&#xff0c;标签也不是特别的丰富&#x…

solana链上智能合约开发案例一则

环境搭建 安装Solana CLI&#xff1a;Solana CLI是开发Solana应用的基础工具。你可以通过官方文档提供的安装步骤&#xff0c;在本地环境中安装适合你操作系统的Solana CLI版本。安装完成后&#xff0c;使用命令行工具进行配置&#xff0c;例如设置网络环境&#xff08;如开发网…

腾讯云存储COS上传视频报错

bug表现为&#xff1a;通过COS上传视频时报错"Class \"QCloud\\COSSTS\\Sts\" not found" 修复办法为&#xff1a;找到文件crmeb/services/upload/storage/Cos.php 将Sts引入由QCloud\COSSTS\Sts;改为crmeb\services\upload\extend\cos\Sts; 修改后重启服…

已有docker增加端口号,不用重新创建Docker

已有docker增加端口号&#xff0c;不用重新创建Docker 1. 整体描述2. 具体实现2.1 查看容器id2.2 停止docker服务2.3 修改docker配置文件2.4 重启docker服务 3. 总结 1. 整体描述 docker目前使用的非常多&#xff0c;但是每次更新都需要重新创建docker&#xff0c;也不太方便&…

Win11 24H2新BUG或影响30%CPU性能,修复方法在这里

原文转载修改自&#xff08;更多互联网新闻/搞机小知识&#xff09;&#xff1a; 一招提升Win11 24H2 CPU 30%性能&#xff0c;小BUG大影响 就在刚刚&#xff0c;小江在网上冲浪的时候突然发现了这么一则帖子&#xff0c;标题如下&#xff1a;基准测试&#xff08;特别是 Time…

C#桌面应用制作计算器

C#桌面应用制作简易计算器&#xff0c;可实现数字之间的加减乘除、AC按键清屏、Del按键清除末尾数字、/-按键取数字相反数、%按键使数字缩小100倍、按键显示运算结果等...... 页面实现效果 功能实现 布局 计算器主体使用Panel容器&#xff0c;然后将button控件排列放置Pane…

Cloud Native 云原生后端的开发注意事项

在云原生后端开发里&#xff0c;数据管理和存储这块得好好弄。数据库选型得综合考虑&#xff0c;像关系型数据有复杂查询需求就选 MySQL、PostgreSQL&#xff0c;海量非结构化数据就可以考虑 MongoDB、Cassandra 这些。设计数据库得遵循规范化原则&#xff0c;像设计电商订单表…

25.UE5时间膨胀,慢动作,切换地图,刷BOSS

2-27 时间膨胀、慢动作、切换地图、刷BOSS_哔哩哔哩_bilibili 目录 1.刷新BOSS逻辑 2.时间膨胀实现慢动作 3.胜利画面&#xff0c;下一关 3.1胜利画面UI 3.2第一关、第二关游戏模式 3.3下一关按钮事件的绑定 1.刷新BOSS逻辑 实现当场上的怪物都死亡后&#xff0c;进行刷…

汽车资讯新动力:Spring Boot技术革新

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了汽车资讯网站的开发全过程。通过分析汽车资讯网站管理的不足&#xff0c;创建了一个计算机管理汽车资讯网站的方案。文章介绍了汽车资讯网站的系统分析部分&…

华为防火墙技术基本概念学习笔记

1.防火墙概述 1.1防火墙与交换机、路由器对比 路由器与交换机的本质是转发&#xff0c;防火墙的本质是控制。 防火墙与路由器、交换机是有区别的。路由器用来连接不同的网络&#xff0c;通过路由协议保证互联互通&#xff0c;确保将报文转发到目的地;交换机则通常用来组建局域…

Pytest-Bdd-Playwright 系列教程(12):步骤参数 parsers参数解析

Pytest-Bdd-Playwright 系列教程&#xff08;12&#xff09;&#xff1a;步骤参数 & parsers参数解析 前言一、什么是步骤参数&#xff1f;二、pytest-bdd 的步骤参数用法2.1 简单字符串解析2.2 自定义正则表达式解析2.3 参数类型转换 三、案例&#xff1a;基于 pytest-bdd…

EHOME视频平台EasyCVR多品牌摄像机视频平台监控视频编码H.265与Smart 265的区别?

在视频监控领域&#xff0c;技术的不断进步推动着行业向更高效、更智能的方向发展。特别是在编码技术方面&#xff0c;Smart 265作为一种新型的视频编码技术&#xff0c;相较于传统的H.265&#xff0c;有明显优势。这种技术的优势在EasyCVR视频监控汇聚管理平台中得到了充分的体…

利用redis的key失效监听器KeyExpirationEventMessageListener作任务定时提醒功能

某需求&#xff1a; 要求在任务截止日期的前3天时&#xff0c;系统自动给用户发一条消息提醒。 用定时任务的话感觉很不舒服。间隔时间不好弄。不能精准卡到那个点。 由于系统简单&#xff0c;没有使用消息列队&#xff0c;也不能使用延时队列来做。 用Timer的话开销还挺大的&a…

数造科技亮相第26届高交会并接受媒体采访,以数据智能赋能未来

11 月 14 日至 16 日&#xff0c;第二十六届中国国际高新技术成果交易会&#xff08;简称“高交会”&#xff09;在深圳成功举办。本届大会以“科技引领发展&#xff0c;产业融合聚变”为主题&#xff0c;汇聚了全球最新的科技成果&#xff0c;打造了一场科技界的盛大聚会。 在…

Facebook广告投放如何提高过审率?

在Facebook进行广告投放活动时&#xff0c;如何让广告过审应该是让很多人头疼的事情&#xff0c;前期花时间准备文案素材等&#xff0c;结果广告不过审&#xff0c;等于一切的前期准备都打水漂了&#xff0c;特别是黑五类的一些产品。许多独立站会架设斗篷&#xff0c;根据市场…