Java标签提高for循环运行效率,减少资源开销

一,Java标签提高for循环运行效率,减少资源开销

少说先看代码再讲解

List<Long> lefts = new ArrayList<>();
List<Long> rights = new ArrayList<>();
lefts.add(0L);
lefts.add(1L);
lefts.add(2L);
lefts.add(3L);
lefts.add(4L);
lefts.add(5L);
lefts.add(6L);
lefts.add(7L);rights.add(0L);
rights.add(1L);
rights.add(2L);
rights.add(3L);
rights.add(4L);
rights.add(5L);
rights.add(6L);
rights.add(7L);int total = 0;
outerLoop:for (int i = 0; i < lefts.size(); i++) {Long left = lefts.get(i);System.out.println("----------------外层循环次数"+i);for (int j = 0; j < rights.size(); j++) {Long right = rights.get(j);total ++;if (left.equals(right) ){System.out.println("----------------内层匹配成功循环次数"+j);continue outerLoop;}else {System.out.println("----------------内层匹配失败循环次数"+j);}}
}
System.out.println("-----------总循环次数---------》"+total);

再看这段代码以及执行结果

for (int i = 0; i < lefts.size(); i++) {Long left = lefts.get(i);System.out.println("----------------外层循环次数"+i);for (int j = 0; j < rights.size(); j++) {Long right = rights.get(j);total ++;if (left.equals(right) ){System.out.println("----------------内层匹配成功循环次数"+j);}else {System.out.println("----------------内层匹配失败循环次数"+j);}}
}

让我来解释一下代码的执行过程和输出结果:

  1. 首先,定义了两个列表 lefts 和 rights,并向它们分别添加了从 0 到 7 的 Long 类型数据。

  2. 接着,使用外层循环(i 循环)遍历 lefts 列表,内部嵌套一个循环(j 循环)遍历 rights 列表。

  3. 在内层循环中,每次循环比较 lefts.get(i) 和 rights.get(j) 是否相等,如果相等则打印匹配成功的信息并通过 continue outerLoop; 跳出外层循环,否则打印匹配失败的信息。

  4. 最后统计总循环次数,即 total++,最终输出总循环次数。

  5. 使用了自定义标签 outerLoop 后,当发生匹配成功时,会直接跳出外层循环,而不再执行外层循环的剩余部分。没有使用标签时,会继续执行外层循环的剩余部分。

因此,加上标签执行总执行次数为 36 次,而没有标签执行总次数为 64 次。这是因为使用标签可以在匹配成功时提前结束外层循环,从而减少了总循环次数。标签的使用使得程序更有效率地执行,避免了不必要的循环

源码中也有用到,接下来源码分析 ThreadPoolExecutor类

private boolean addWorker(Runnable firstTask, boolean core) {retry:for (int c = ctl.get();;) {// Check if queue empty only if necessary.if (runStateAtLeast(c, SHUTDOWN)&& (runStateAtLeast(c, STOP)|| firstTask != null|| workQueue.isEmpty()))return false;for (;;) {if (workerCountOf(c)>= ((core ? corePoolSize : maximumPoolSize) & COUNT_MASK))return false;if (compareAndIncrementWorkerCount(c))break retry;c = ctl.get();  // Re-read ctlif (runStateAtLeast(c, SHUTDOWN))continue retry;// else CAS failed due to workerCount change; retry inner loop}}boolean workerStarted = false;boolean workerAdded = false;Worker w = null;try {w = new Worker(firstTask);final Thread t = w.thread;if (t != null) {final ReentrantLock mainLock = this.mainLock;mainLock.lock();try {// Recheck while holding lock.// Back out on ThreadFactory failure or if// shut down before lock acquired.int c = ctl.get();if (isRunning(c) ||(runStateLessThan(c, STOP) && firstTask == null)) {if (t.isAlive()) // precheck that t is startablethrow new IllegalThreadStateException();workers.add(w);int s = workers.size();if (s > largestPoolSize)largestPoolSize = s;workerAdded = true;}} finally {mainLock.unlock();}if (workerAdded) {t.start();workerStarted = true;}}} finally {if (! workerStarted)addWorkerFailed(w);}return workerStarted;
}

重点讲述 这里面的break和continue 区别

  1. 在代码中的 break retry; 语句被用于跳出外层的 for 循环。这意味着当程序执行到这一行时,会跳出标签为 retry 的 for 循环,继续执行标签后面的代码。这种形式的标签跳转允许程序在复杂的嵌套结构中更灵活地控制代码的执行流程。

  2. 在代码中的 continue retry; 语句被用于跳转到标签为 retry 的循环的下一次迭代。也就是说,当程序执行到这一行时,会跳转到标签为 retry 的 for 循环的下一次迭代处继续执行,而不再执行当前迭代后面的代码。

介绍一下break和continue的区别

  1. break:

    • 当在循环语句(如 for、while、do-while)中执行 break 语句时,会立即终止当前循环的执行,并跳出该循环,开始执行循环语句后面的代码。

    • 如果 break 语句在嵌套循环中使用,它将只中断最内层的循环,跳出最近的一层循环。

  2. continue:

    • 当在循环语句中执行 continue 语句时,会跳过当前循环中剩余的代码,直接进入下一次循环的迭代过程。

    • continue 通常与条件语句结合使用,用于跳过特定条件下的循环体中的某些代码。

优点:

  1. 精确控制流程:自定义标签可以帮助程序员精确控制代码执行流程,特别是在嵌套循环或复杂逻辑中跳出外部循环或代码块。

  2. 提高可读性:标签可以使代码更清晰易懂,特别是在需要直接跳转到某个代码块时,标签能够准确地标识目标位置。

  3. 增加灵活性:使用标签可以使代码更加灵活,能够处理一些特殊情况或流程,从而提高代码的适应性和扩展性。

缺点:

  1. 复杂化代码结构:过度使用标签可能会导致代码结构变得复杂,降低代码的可维护性和可读性,使得代码难以理解。

  2. 容易引入错误:使用标签可能会增加代码的复杂性,从而增加引入错误的可能性,特别是在多人协作或后续维护时。

  3. 不常用:标签的使用频率相对较低,一般情况下可以通过其他方式来实现相同的功能,因此有些程序员可能不熟悉标签的使用,造成代码阅读困难。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

修改Linux系统时间与网络同步

文章目录 1、安装ntpdate2、修改时区3、设置系统时间与网络时间同步4、将系统时间写入硬件时间 1、安装ntpdate # Red Hat和Cent OS系统 sudo yum install ntpdate # 乌班图 sudo apt-get install ntpdate2、修改时区 1&#xff09;运行tzselect tzselect2&#xff09;选择A…

52、Qt/窗口、常用类、ui相关学习20240321

一、使用Qt 自由发挥登录窗口的应用场景&#xff0c;实现一个登录窗口界面。 要求&#xff1a; 1. 需要使用Ui界面文件进行界面设计 2. ui界面上的组件相关设置&#xff0c;通过代码实现 3. 需要添加适当的动图。 代码&#xff1a; #include "widget.h" #incl…

两台不同账号同一区域阿里云服务器如何实现内网互通?

登录阿里云平台 [开通peer对等] 点击右上角的控制台&#xff0c;然后进行搜索专有网络VPC。 点击进入专有网络VPC界面操作步骤如下&#xff1a; &#xff08;1&#xff09;点击VPC对等连接&#xff0c;然后开通VPC对等连接后创建对等连接。 &#xff08;2&#xff09;在另…

【计算机】——51单片机——持续更新

单片机是一种内部包含CPU、存储器和输入/输出接口等电路的集成电路&#xff08;IC芯片&#xff09; 单片机是单片微型计算机&#xff08;Single Chip Microcomputer&#xff09;的简称&#xff0c;用于控制领域&#xff0c;所以又称为微型控制器&#xff08;Microcontroller U…

038—pandas 重采样线性插补

前言 在数据处理时&#xff0c;由于采集数据量有限&#xff0c;或者采集数据粒度过小&#xff0c;经常需要对数据重采样。在本例中&#xff0c;我们将实现一个类型超分辨率的操作。 思路&#xff1a; 首先将原始数据长度扩展为 3 倍&#xff0c;可以使用 loc[] 方法对索引扩…

OpenCV4.9.0开源计算机视觉库安装教程

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 引言&#xff1a;OpenCV系列文章中的安装部分今天全部完成了&#xff0c;为了读者更方便阅读&#xff0c;大家可以按下列索引前往&#xff0c;成文较为仓促有错漏在所难免&#xff0c;欢迎大家指正…

【C#】使用C#窗体应用开启/停止Apache、MySQL服务

目录 一、前言 二、效果图 三、配置文件 四、代码 五、一键启动/停止所有服务 一、前言 使用C#窗体应用开启Apache、MySQL服务&#xff0c;不仅仅是Apache、MySQL&#xff0c;其他服务也可以使用同样的方法操作&#xff0c;包括开启自己写的脚本服务。 二、效果图 两种状…

JavaSE—IO流之字符流

&#x1f4cc; 字符流中的常用类及基本方法&#xff1a; 输入字符流 Reader输出字符流 Writer ○ Reader 的基本方法&#xff1a; • 读取一个字符并以整数的形式返回, 如果返回-1已到输入流的末尾。 int read() throws IOException • 读取一系列字符并存储到一个数组buff…

BufferedInputStream解读

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java之IO流啦&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好习惯&am…

继承和多态(2)(多态部分)

提前讲的重要知识点 一个类在没有父类的情况下默认有一个父类为Object类。 而当在有父类情况下&#xff0c;如果你那父类没有父类&#xff0c;则其父类的父类默认为object类&#xff0c;所以即使一个类有父类&#xff0c;其内部还是有object类。 object类都是隐藏起来的&…

【周总结】

周总结 完成项目混合版时区改造 完成相关jira问题的修改 完成老版本APP数据保存接口的兼容&#xff0c;手动赋值时区 2024/03/24 天气阴 一点不冷 1.Its time to go、Spring is coming&#xff01; 2. Its a nice day that staying with friends in a peaceful …

2024年云服务器ECS价格表出炉——腾讯云

腾讯云服务器多少钱一年&#xff1f;61元一年起。2024年最新腾讯云服务器优惠价格表&#xff0c;腾讯云轻量2核2G3M服务器61元一年、2核2G4M服务器99元一年可买三年、2核4G5M服务器165元一年、3年756元、轻量4核8M12M服务器646元15个月、4核16G10M配置32元1个月、312元一年、8核…

成功案例|全基因组测序+GWAS联合分析揭示不同种族帕金森病的遗传同质性和异质性

发表期刊&#xff1a;npj Parkinson’s Disease 影响因子&#xff1a;8.7 测序方式&#xff1a;WGS 研究对象&#xff1a;人 1 研究背景 帕金森病&#xff08;PD&#xff09;是一种常见的与年龄相关的神经退行性疾病&#xff0c;其特征是运动迟缓、姿势不稳定、僵硬和静息…

Redis中的过期键删除策略

过期键删除策略 概述 数据库键的过期时间都保存在过期字典中&#xff0c;并且知道根据过期时间去判断一个键是否过期,剩下的问题是&#xff1a;如果一个键过期了&#xff0c;那么它什么时候会被删除呢? 这个问题有三种可能的答案&#xff0c;它们分别代表了三种不同的删除策…

【linux】进程的地址空间

1.代码看现象引入 #include<stdio.h>#include<unistd.h>#include<string.h> #include<stdlib.h>int val100;int main (){ printf("i am father,pid:%d,ppid:%d,val:%d&#xff0c;&val:%p\n",getpid(),getppid(),val,&val);size_t…

vue2 和 vue3 配置路由有什么区别

vue2 和 vue3 配置路由有什么区别 初始化路由器实例&#xff1a;注入到应用中&#xff1a;动态路由参数和捕获所有路由&#xff1a;编程式导航 API&#xff1a;异步加载组件&#xff1a; vue2 如何 使用路由 第一步&#xff1a;安装 vue-router第二步&#xff1a;创建路由组件第…

【k8s】kubeasz 3.6.3 + virtualbox 搭建本地虚拟机openeuler 22.03 三节点集群 离线方案

kubeasz项目源码地址 GitHub - easzlab/kubeasz: 使用Ansible脚本安装K8S集群&#xff0c;介绍组件交互原理&#xff0c;方便直接&#xff0c;不受国内网络环境影响 拉取代码&#xff0c;并切换到最近发布的分支 git clone https://github.com/easzlab/kubeasz cd kubeasz gi…

<Linux> 模拟实现文件流 - 简易版

目录 1. FILE 结构设计 2、函数使用及分析 3、文件打开 fopen 4. 缓冲区刷新fflush 5. 数据写入fwrite 6. 文件关闭 fclose 7. 测试 8. 小结 1. FILE 结构设计 在设计 FILE 结构体前&#xff0c;首先要清楚 FILE 中有自己的缓冲区及冲刷方式 缓冲区的大小和刷新方式因…

JVM监控工具

JVM监控工具 文章目录 JVM监控工具jpsjmapjmap -histo 进程idjmap -heap 进程id (查看堆信息)jmap -dump:formatb,filefilename.hprof 进程id (将堆当前时刻快照信息dump到文件中) JSTACKjstack 查看死锁信息jstack找出占用cpu最高的线程堆栈信息 jinfo查看jvm参数查看java系统…

Perfetto Trace抓取

1. Perfetto简介 Perfetto 是一个用于 Android 系统的性能跟踪工具&#xff0c;可以帮助开发者分析系统性能和调试问题。 Perfetto 是 Android 10 中引入的全新平台级跟踪工具。这是适用于 Android、Linux 和 Chrome 的更加通用和复杂的开源跟踪项目。 在低于Android R的版本上…