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

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

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

相关文章

时间序列预测实战(十五)PyTorch实现GRU模型长期预测并可视化结果

往期回顾&#xff1a;时间序列预测专栏——包含上百种时间序列模型带你从入门到精通时间序列预测 一、本文介绍 本文讲解的实战内容是GRU(门控循环单元)&#xff0c;本文的实战内容通过时间序列领域最经典的数据集——电力负荷数据集为例&#xff0c;深入的了解GRU的基本原理和…

百度智能云千帆大模型平台再升级,SDK版本开源发布!

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化&#xff0c;文章内容兼具广度、深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于…

设置虚拟机静态IP

1、修改配置文件 /etc/sysconfig/network-scripts/ifcfg-ens160 将BOOTPROTOdhcp改为static&#xff0c;天机IPADDR192.168.10.13 2、重启网络服务 systemctl restart network

批量重命名软件推荐 A Better Finder Rename 12最新 for mac

A Better Finder Rename的大量重命名选项被组织成15个直观的类别&#xff0c;涵盖了一个伟大的文件重命名器所期望的所有文本&#xff0c;字符&#xff0c;位置&#xff0c;转换和截断功能。 除此之外&#xff0c;A Better Finder Rename提供了更多高级功能&#xff0c;可以满…

C51--PC通过串口(中断)点亮LED

B4中的&#xff1a;REN允许 / 禁止串行接收控制位 REN 1为允许串行接收状态。 接收数据必须开启。所以SCON&#xff1a;0101 0000 &#xff1b;即0x50 如何知道数据已经接收 RI位&#xff1a;当收到数据后 RI 1&#xff08;由硬件置一&#xff09; 硬件置一后必须用软件…

JSON.parse --- 搜索框

一 &#xff0c; JSON.parse this.num_normsTwo JSON.parse(res.result.normsTwo) 二. 搜索框 <template><div class"app-container"><span style"margin-left:120px;margin-right: 20px;width: 100px; display: inline-block;">物…

GNSS接收机:高精度定位终端

GNSS(全球卫星导航系统)接收机是一种强大的设备&#xff0c;能够利用多个卫星信号来进行高精度定位。计讯物联GNSS接收机多星多频厘米级高精度定位&#xff0c;IP68高等级防护&#xff0c;支持外接传感器数据采集&#xff0c;数据上云远程在线监控&#xff0c;适用于山体滑坡监…

守护进程daemon(),C 库函数asctime、localtime,UDEV的配置文件,开机自启动,自动挂载U盘

一、守护进程 二、daemon()函数 三、C 库函数asctime、localtime 四、设置守护进程开机自启动 五、守护进程应用 编写判断守护进程是否在运行的程序 守护进程不让控制程序退出 把相关守护进程设置成开机自启动 六、dmesg 七、UDEV的配置文件&#xff08;udev的rules编写&am…

深度学习 机器视觉 车位识别车道线检测 - python opencv 计算机竞赛

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习 机器视觉 车位识别车道线检测 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分) …

Leetcode179. 最大数

Every day a Leetcode 题目来源&#xff1a;179. 最大数 解法1&#xff1a;贪心 对于数组 nums 中的任意两个数 a 和 b&#xff0c;我们将其转换为字符串后&#xff0c;如果 to_string(a) to_string(b) > to_string(b) to_string(a)&#xff0c;说明 a 应该放在 b 的前…

微信怎么群发消息?答案在这,1分钟就能学会!

微信群发消息是一种方便快捷的消息发送方式&#xff0c;该功能允许用户一次性给多个好友发送相同的内容。一般来说&#xff0c;群发消息比较适用于发送节日祝福、通知、品牌推广等场景。微信怎么群发消息&#xff1f;本文将给大家详细介绍微信群发消息的操作方法&#xff0c;只…

如何使用Echarts

以umi为例 首先是下载两个插件&#xff08;echarts和echarts-for-react&#xff09; npm npm install --save echarts-for-react npm install echarts yarn yarn add echarts-for-react yarn add echarts 接下来是在tsx或jsx中引入使用 import ReactEcharts from "echa…