44条Java代码优化细节-常见的for循环优化方式-《Java笔记》

admin 2025-10-19 02:52:55 编程 来源:ZONE.CI 全球网 0 阅读模式

Java for

前言

经常使用一些循环耗时计算的操作,特别是for循环,它是一种重复计算的操作,如果处理不好,耗时就比较大,如果处理书写得当将大大提高效率,下面总结几条for循环的常见优化方式。首先初始化一个集合 list,如下:

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

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

  1. for (int i = 0; i < list.size(); i++) {
  2. System.out.println(list.get(i));
  3. }
  • 优点:较常见,易于理解
  • 缺点:每次都要计算list.size()

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

    1. int m = list.size();
    2. for (int i = 0; i < m; i++) {
    3. System.out.println(list.get(i));
    4. }
  • 优点:不必每次都计算

  • 缺点:

    1. m的作用域不够小,违反了最小作用域原则
    2. 不能在for循环中操作list的大小,比如除去或新加一个元素

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

      1. for (int i = 0, n = list.size(); i < n; i++) {
      2. System.out.println(list.get(i));
      3. }
  • 优点:不必每次都计算 ,变量的作用域遵循最小范围原则

  • 缺点:

    1. m的作用域不够小,违反了最小作用域原则
    2. 不能在for循环中操作list的大小,比如除去或新加一个元素

      方法四:采用倒序的写法

      1. for (int i = list.size() - 1; i >= 0; i--) {
      2. System.out.println(list.get(i));
      3. }
  • 优点:不必每次都计算 ,变量的作用域遵循最小范围原则

  • 缺点:1、结果的顺序会反 2、看起来不习惯,不易读懂
  • 适用场合:与显示结果顺序无关的地方:比如保存之前数据的校验

    方法五:Iterator 遍历

    1. for (Iterator<String> it = list.iterator(); it.hasNext();) {
    2. System.out.println(it.next());
    3. }
  • 优点:简洁

    方法六:jdk1.5后的写法

    1. for (Object o : list) {
    2. System.out.println(o);
    3. }
  • 优点:简洁结合泛型使用更简洁

  • 缺点:jdk1.4向下不兼容

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

    1. for (int i = 0; i < 10; i++) {
    2. for (int j = 0; j < 10000; j++) {
    3. }
    4. }
    原因分支优化规则引人流水线工作机制以后,为了配合流水线工作,处理器增加了一个分支目标缓冲器( Branch Target Buffer)。在流水线工作模式下,如果遇到分支结构,就可以利用分支目标缓冲器预测并读取指令的目标地址。分支目标缓冲器在程序运行时将动态记录和调整转移指令的目标地址,可以记录多个地址,对其进行表格化管理。当发生转移时,如果分支目标缓冲器中有记录,下一条指令在取指令阶段就会将其作为目标地址。如果记录地址等于实际目标地址,则并行成功;如果记录地址不等于实际目标地址,则流水线被冲洗。同一个分支,多次预测失败,则更新记录的目标地址。因此,分支预测属于“经验主义”或“机会主义”,会存在一定的误测。基于上述原因,大家以后在编写多重循环时应该把大循环放到内层,这样可以增加分支预测的准确度,如下面的示例所示:
    1. for (int i = 0; i < 10; i++){
    2. //下面每次循环会预测成功9999次
    3. //第1次没有预测,最后退出循环时预测失败1次这样的
    4. //过程重复10次
    5. for (int j = 0; j < 10000; j++) {
    6. a[i][j]++ ;
    7. }
    8. }
    9. for (int j = 0: j < 10000; j++) {
    10. //下面每次循环会预测成功9次
    11. //第1次没有预测,最后退出循环时预测失败1次
    12. //这样的过程重复10000次
    13. for (int i = 0; i < 10 ; i++) {
    14. a[i][j]++;
    15. }
    16. }

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

    ```java //前: 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; }

  1. <a name="U9kAp"></a>
  2. ### 方法九:异常处理写在循环外面
  3. 反例
  4. ```java
  5. for (int i = 0; i < 10; i++) {
  6. try {
  7. } catch (Exception e) {
  8. }
  9. }

正例

  1. try {
  2. for (int i = 0; i < 10; i++) {
  3. }
  4. } catch (Exception e) {
  5. }
以太坊cppgolang区别 编程

以太坊cppgolang区别

以太坊是一种去中心化的开源平台,它采用智能合约技术,旨在构建和运行不受干扰的分布式应用程序。作为目前最受欢迎的区块链平台之一,以太坊提供了多种编程语言的支持,其
progolang 编程

progolang

Go语言(Golang)是由Google开发的一门静态类型编程语言。作为一名专业的Golang开发者,我深知这门语言的优势和特点。在本文中,我将介绍Golang
golangn个发送者 编程

golangn个发送者

Golang是一种开源的编程语言,由Google团队开发,旨在提高程序的并发性和简化软件开发过程。在Go语言中,有时需要向多个接收者发送信息。本文将介绍如何在G
golang技能图谱 编程

golang技能图谱

从互联网行业的快速发展到人工智能技术的日益成熟,各种编程语言也应运而生。而在这众多的编程语言中,Golang(即Go)作为一门强大且高效的开发语言备受关注。Go
评论:0   参与:  8