这 11 个 for 循环优化你得会

日常开发中,经常会遇到一些循环耗时计算的操作,一般也都会采用 for 循环来处理,for 作为编程入门基础,主要是处理重复的计算操作,虽然简单好用,但在写法上也有很多的考究,如果处理不好,可能成为拖垮程序的罪魁祸首,下面总结 10 多条 for 循环的常见优化方式,让代码优雅起来。

首先,我们初始化一个集合 list,如下:

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

方式一:最常规的不加思考的写法

for (int i = 0; i < list.size(); i++) {
 System.out.println(list.get(i));
}

  • 优点:较常见,易于理解

  • 缺点:每次都要计算list.size()

 方式二:数组长度提取出来

int m = list.size();
for (int i = 0; i < m; i++) {
      System.out.println(list.get(i));
}

  • 优点:不必每次都计算

  • 缺点:

    1. m的作用域不够小,违反了最小作用域原则

    2. 不能在for循环中操作list的大小,比如除去或新加一个元素

方式三:数组长度提取出来 

for (int i = 0, n = list.size(); i < n; i++) {
    System.out.println(list.get(i));
}

  • 优点:不必每次都计算 ,变量的作用域遵循最小范围原则

  • 缺点:

    1. m的作用域不够小,违反了最小作用域原则

    2. 不能在for循环中操作list的大小,比如除去或新加一个元素

 方式四:采用倒序的写法

for (int i = list.size() - 1; i >= 0; i--) {
   System.out.println(list.get(i));
}

  • 优点:不必每次都计算 ,变量的作用域遵循最小范围原则

  • 缺点:

    1. 结果的顺序会反

    2. 看起来不习惯,不易读懂

  • 适用场合:与显示结果顺序无关的地方:比如保存之前数据的校验

 方式五:Iterator 遍历

for (Iterator<String> it = list.iterator(); it.hasNext();) {
      System.out.println(it.next());
}

  • 优点:简洁

 方式六:jdk1.5后的写法

for (Object o : list) {
     System.out.println(o);
}

  • 优点:简洁结合泛型使用更简洁

  • 缺点:

    1. jdk1.4向下不兼容

    2. 无法直接拿到索引

 方式七:循环嵌套外小内大原则

for (int i = 0; i < 10; i++) {
   for (int j = 0; j < 10000; j++) {
   }
}

方式八:循环嵌套提取不需要循环的逻辑

//前:
int a = 10, b = 11;
 for (int i = 0; i < 10; i++) {
    i = i * a * b;
 } 
 
 
//后:
int c = a * b;
for (int i = 0; i < 10; i++) {
    i = i * c;
}

方式九:异常处理写在循环外面

反例

for (int i = 0; i < 10; i++) {
    try {

    } catch (Exception e) {

    }
}

正例

try {
   for (int i = 0; i < 10; i++) {
   }
} catch (Exception e) {
}

不过这种写法也不是绝对,需要考虑循环过程中如果出现异常是否要中止流程,如果不需要中止循环,就需要将异常处理放在循环体内,用来捕获单次循环出现的异常,避免因为单词异常导致整个for循环后续中止

方式十:倒序删除

如果不使用迭代器遍历删除时,可以采用倒叙的方式遍历删除元素,避免因为索引变化导致异常

for (int i = list.size()-1; i >= 0; i--) {
    // 循环体
    list.remove(i);
}

优化后的代码:

for (int i = list.size()-1; i >= 0; i--) {
    // 循环体
    list.remove(i);
}

方式十一:减少方法调用

在循环体内部尽可能减少方法的调用,可以避免重复的方法调用开销。对于频繁调用的方法,可以将结果缓存起来。

int size = list.size();
for (int i = 0; i < size; i++) {
    // 频繁调用的方法
    // 这部分调用和当前的循环没有直接性关系,就可以不放在循环体内
    int result = calculateResult();
    // 循环体
}

优化后的代码:

int size = list.size();
int result = calculateResult();
for (int i = 0; i < size; i++) {
    // 使用缓存的结果
    // 循环体
}

以上是一些常见的for循环,很多都是一些不起眼的小细节,改或不改都不会影响代码的正常执行,但用户多了之后,众多小问题累积起来可能就影响到整个系统的运行,所以,需要在日常开发中多注意这些小细节,避免日后再来还技术债...

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

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

相关文章

「Verilog学习笔记」用优先编码器①实现键盘编码电路

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 分析 用此编码器实现键盘的编码电路。 注意&#xff1a;编码器的输出是低电平有效&#xff0c;而键盘编码电路输出的是正常的8421BCD码&#xff0c;是高电平有效。因此将编…

论文精读 MediaPipe Hands

MediaPipe Hands:On-device Real-time Hand Tracking MediaPipe手势&#xff1a;设备上的实时手势跟踪 论文地址&#xff1a;2006.10214.pdf (arxiv.org) 源码地址&#xff1a;GitHub - vidursatija/BlazePalm: PyTorch 目录 摘要 介绍 架构 BlazePalm Detector Hand L…

基于Java实现的轻量级私有云平台,让企业拥有自己的云平台

一、开源项目简介 KVM Cloud 是一款基于Java实现的轻量级私有云平台&#xff0c;旨在帮助中小企业快速实现计算、存储、网络等资源的管理&#xff0c;让企业拥有自己的云平台。 二、开源协议 使用Apache-2.0开源协议 三、界面展示 四、功能概述 KVM Cloud 是一款基于Java实…

Cesium和Three.js的初步认识

一、Threejs和Cesium的对比 相同点&#xff1a; 都是基于WebGL技术开发的Javascript库&#xff0c;用于在浏览器中创建和显示动画3D计算机图形。 不同点&#xff1a; Threejs&#xff1a;受众面比较广&#xff0c;是封装了webgl的一些底层用法&#xff0c;让初学者更容易上…

Istio学习笔记- 服务网格

Istio 服务网格 参考&#xff1a;Istio / Istio 服务网格 Istio 使用功能强大的 Envoy 服务代理扩展了 Kubernetes&#xff0c;以建立一个可编程的、可感知的应用程序网络。Istio 与 Kubernetes 和传统工作负载一起使用&#xff0c;为复杂的部署带来了标准的通用流量管理、遥…

DNS域名解析服务

1.概述 1.1.产生原因 IP 地址:是互联网上计算机唯一的逻辑地址&#xff0c;通过IP 地址实现不同计算机之间的相互通信&#xff0c;每台联网计算机都需要通过I 地址来互相联系和分别&#xff0c;但由于P 地址是由一串容易混淆的数字串构成&#xff0c;人们很难记忆所有计算机的…

labview实现仪器的控制visa

*IDN? 是识别大多数仪器的查询指令。仪器会回应一个用于描述仪器的识别字符串。如果仪器不接受该指令&#xff0c;请在仪器手册中查询仪器能识别的指令列表。 如下图所示&#xff1a; 程序如下&#xff1a;

【汇编】计算机的组成

文章目录 前言一、计算机的基本组成1.1 中央处理器&#xff08;CPU&#xff09;1.2 内存指令和数据存储的位置计算机中的存储单元计算机中的总线地址总线数据总线控制总线 1.3 输入设备和输出设备1.4 存储设备 二、计算机工作原理三、计算机的层次结构总结 前言 计算机是现代社…

容器化nacos部署并实现服务发现(gradle)

1.如何容器化部署mysql 2. 如何容器化部署nacos 为不暴露我的服务器地址&#xff0c;本文全部使用localhost来代替服务器地址&#xff0c;所有的localhost都应该调整为你自己的服务器地址。 为不暴露我的服务器地址&#xff0c;本文全部使用localhost来代替服务器地址&#x…

Centos上删除文件及目录的命令积累

01-如果我想删除Centos上当前目录下的文件 test06-2023-11-14-01.sql 该怎么操作&#xff1f; 答&#xff1a;如果你想删除CentOS上当前目录下的文件 test06-2023-11-14-01.sql&#xff0c;可以使用 rm 命令。以下是删除文件的基本语法&#xff1a; rm test06-2023-11-14-01.s…

《QT从基础到进阶·二十三》弹窗提示框QMessageBox和QCloseEvent事件

1、正常信息提示 QMessageBox::information(NULL, "Title", "Content", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);消息框按钮判断&#xff1a; if(QMessageBox::Ok QMessageBox::warning(this,"温馨提示","是否保存设置?…

BGP路由控制实验

目录 一、实验拓扑 二、实验需求 三、实验步骤 1、IP地址配置 2、As 200 内部配置OSPF 3、建立BGP邻居关系 4、宣告网段&#xff0c;在BGP中传递网段 5、通过修改MED 使 R1 到达 192.168.2.0/24 网段的路由经过 R3 6、通过修改Preferred-value 属性&#xff0c;使 R4 …

6.6二叉树的最大深度(LC104-E)、N叉树的最大深度(LC559-E)

二叉树的最大深度&#xff1a; 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 二叉树的最大深度二叉树的高度 算法&#xff1a; 这道题既可以求深度&#xff0c;也可以直接求高度。不过高度和深度用的遍历方式不同。 二叉树写代码之前要确定遍历顺序…

从零开始,掌握Nacos搭建的艺术(单点、集群、docker-compose)

&#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 从零开始&#xff0c;掌握Nacos 前言&#xff1a;前提&#xff1a;建表语句第一&#xff1a; 单节点搭建&#xff1a;第二&#xff1a; 集群搭建&#xff1a;第三&#xff1a…

BUUCTF 来首歌吧 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 密文&#xff1a; 下载附件&#xff0c;解压得到一个.wav音频文件。 解题思路&#xff1a; 1、得到一个音频文件&#xff0c;放到Audacity看看。看到有两条音轨&#xff0c;放大上面的那条音轨&#xff0c;看到这…

Shiro快速入门之三

一、前言 接Shiro快速入门之二&#xff0c;上篇侧重于介绍认证&#xff0c;这篇介绍一下Shiro的授权&#xff0c;先初始化5张表的数据。 注&#xff1a;创建三条权限记录&#xff0c;一个admin角色分配查询和添加用户权限&#xff0c;一个账户qingcai18036授予管理员角色。 二…

python数据结构与算法-04_队列

队列和栈 前面讲了线性和链式结构&#xff0c;如果你顺利掌握了&#xff0c;下边的队列和栈就小菜一碟了。因为我们会用前两章讲到的东西来实现队列和栈。 之所以放到一起讲是因为这两个东西很类似&#xff0c;队列是先进先出结构(FIFO, first in first out)&#xff0c; 栈是…

android studio开发flutter应用,使用mumu模拟器调试软件

安装好mumu模拟器&#xff0c;先打开网易mumu模拟器的开发者模拟。系统应用 > 设置 > 关于手机 > 版本号 多点击几次调出开发者模式&#xff1a; 然后在android studio中刷新设备列表&#xff0c;就能看到新设备了&#xff1a; 如何确定这个设备就是你的mumu模拟器呢…

2012年11月10日 Go生态洞察:Go语言三周年回顾

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

预览PDF并显示当前页数

这里写目录标题 步骤实例实例效果图 步骤 1.安装依赖 npm install --save vue-pdf2.在需要的页面&#xff0c;引入插件 import pdf from vue-pdf3.使用 单页pdf可以直接使用 <pdf :src"获取到的pdf地址"></pdf>多页pdf通过循环实现 html标签部分 &l…