阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

for循环

296次阅读
没有评论

共计 2754 个字符,预计需要花费 7 分钟才能阅读完成。

除了 whiledo while循环,Java 使用最广泛的是 for 循环。

for循环的功能非常强大,它使用计数器实现循环。for循环会先初始化计数器,然后,在每次循环前检测循环条件,在每次循环后更新计数器。计数器变量通常命名为i

我们把 1 到 100 求和用 for 循环改写一下:

// for
public class Main {public static void main(String[] args) {int sum = 0;
        for (int i=1; i<=100; i++) {sum = sum + i;}
        System.out.println(sum);
    }
}

for 循环执行前,会先执行初始化语句 int i=1,它定义了计数器变量i 并赋初始值为 1,然后,循环前先检查循环条件i<=100,循环后自动执行i++,因此,和while 循环相比,for循环把更新计数器的代码统一放到了一起。在 for 循环的循环体内部,不需要去更新变量i

因此,for循环的用法是:

for (初始条件; 循环检测条件; 循环后更新计数器) {// 执行语句
}

如果我们要对一个整型数组的所有元素求和,可以用 for 循环实现:

// for
public class Main {public static void main(String[] args) {int[] ns = { 1, 4, 9, 16, 25 };
        int sum = 0;
        for (int i=0; i<ns.length; i++) {System.out.println("i =" + i + ", ns[i] =" + ns[i]);
            sum = sum + ns[i];
        }
        System.out.println("sum =" + sum);
    }
}

上面代码的循环条件是 i<ns.length。因为ns 数组的长度是 5,因此,当循环5 次后,i的值被更新为 5,就不满足循环条件,因此for 循环结束。

思考

如果把循环条件改为 i <=ns.length,会出现什么问题?

注意 for 循环的初始化计数器总是会被执行,并且 for 循环也可能循环 0 次。

使用 for 循环时,千万不要在循环体内修改计数器!在循环体中修改计数器常常导致莫名其妙的逻辑错误。对于下面的代码:

// for
public class Main {public static void main(String[] args) {int[] ns = { 1, 4, 9, 16, 25 };
        for (int i=0; i<ns.length; i++) {System.out.println(ns[i]);
            i = i + 1;
        }
    }
}

虽然不会报错,但是,数组元素只打印了一半,原因是循环内部的 i = i + 1 导致了计数器变量每次循环实际上加了 2(因为for 循环还会自动执行 i++)。因此,在for 循环中,不要修改计数器的值。计数器的初始化、判断条件、每次循环后的更新条件统一放到 for() 语句中可以一目了然。

如果希望只访问索引号为偶数的数组元素,应该把 for 循环改写为:

int[] ns = { 1, 4, 9, 16, 25 };
for (int i=0; i<ns.length; i=i+2) {System.out.println(ns[i]);
}

通过更新计数器的语句 i=i+2 就达到了这个效果,从而避免了在循环体内去修改变量i

使用 for 循环时,计数器变量 i 要尽量定义在 for 循环中:

int[] ns = { 1, 4, 9, 16, 25 };
for (int i=0; i<ns.length; i++) {System.out.println(ns[i]);
}
// 无法访问 i 
int n = i; // compile error!

如果变量 i 定义在 for 循环外:

int[] ns = { 1, 4, 9, 16, 25 };
int i;
for (i=0; i<ns.length; i++) {System.out.println(ns[i]);
}
// 仍然可以使用 i 
int n = i;

那么,退出 for 循环后,变量 i 仍然可以被访问,这就破坏了变量应该把访问范围缩到最小的原则。

灵活使用 for 循环

for循环还可以缺少初始化语句、循环条件和每次循环更新语句,例如:

// 不设置结束条件:
for (int i=0; ; i++) {...}
// 不设置结束条件和更新语句:
for (int i=0; ;) {...}
// 什么都不设置:
for (;;) {...}

通常不推荐这样写,但是,某些情况下,是可以省略 for 循环的某些语句的。

for each 循环

for循环经常用来遍历数组,因为通过计数器可以根据索引来访问数组的每个元素:

int[] ns = { 1, 4, 9, 16, 25 };
for (int i=0; i<ns.length; i++) {System.out.println(ns[i]);
}

但是,很多时候,我们实际上真正想要访问的是数组每个元素的值。Java 还提供了另一种 for each 循环,它可以更简单地遍历数组:

// for each
public class Main {public static void main(String[] args) {int[] ns = { 1, 4, 9, 16, 25 };
        for (int n : ns) {System.out.println(n);
        }
    }
}

for 循环相比,for each循环的变量 n 不再是计数器,而是直接对应到数组的每个元素。for each循环的写法也更简洁。但是,for each循环无法指定遍历顺序,也无法获取数组的索引。

除了数组外,for each循环能够遍历所有“可迭代”的数据类型,包括后面会介绍的 ListMap 等。

练习 1

给定一个数组,请用 for 循环倒序输出每一个元素:

// for
public class Main {public static void main(String[] args) {int[] ns = { 1, 4, 9, 16, 25 };
        for (int i=?; ???; ???) {System.out.println(ns[i]);
        }
    }
}

练习 2

利用 for each 循环对数组每个元素求和:

// for each
public class Main {public static void main(String[] args) {int[] ns = { 1, 4, 9, 16, 25 };
        int sum = 0;
        for (???) {// TODO
        }
        System.out.println(sum); // 55
    }
}

练习 3

圆周率 π 可以使用公式计算:

请利用 for 循环计算 π:

// for
public class Main {public static void main(String[] args) {double pi = 0;
        for (???) {// TODO
        }
        System.out.println(pi);
    }
}

下载练习

小结

for循环通过计数器可以实现复杂循环;

for each循环可以直接遍历数组的每个元素;

最佳实践:计数器变量定义在 for 循环内部,循环体内部不修改计数器;

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-08-05发表,共计2754字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19348
评论数
4
阅读量
7822375
文章搜索
热门文章
开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板 1Panel:小白轻松构建 Web 服务与面板加固指南 哈喽,我是星哥,经常有人问我不...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
240 元左右!五盘位 NAS主机,7 代U硬解4K稳如狗,拓展性碾压同价位

240 元左右!五盘位 NAS主机,7 代U硬解4K稳如狗,拓展性碾压同价位

  240 元左右!五盘位 NAS 主机,7 代 U 硬解 4K 稳如狗,拓展性碾压同价位 在 NA...
终于收到了以女儿为原型打印的3D玩偶了

终于收到了以女儿为原型打印的3D玩偶了

终于收到了以女儿为原型打印的 3D 玩偶了 前些日子参加某网站活动,获得一次实物 3D 打印的机会,于是从众多...
优雅、强大、轻量开源的多服务器监控神器

优雅、强大、轻量开源的多服务器监控神器

优雅、强大、轻量开源的多服务器监控神器 在多台服务器同时运行的环境中,性能监控、状态告警、资源可视化 是运维人...
手把手教你,购买云服务器并且安装宝塔面板

手把手教你,购买云服务器并且安装宝塔面板

手把手教你,购买云服务器并且安装宝塔面板 前言 大家好,我是星哥。星哥发现很多新手刚接触服务器时,都会被“选购...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
星哥带你玩飞牛NAS-12:开源笔记的进化之路,效率玩家的新选择

星哥带你玩飞牛NAS-12:开源笔记的进化之路,效率玩家的新选择

星哥带你玩飞牛 NAS-12:开源笔记的进化之路,效率玩家的新选择 前言 如何高效管理知识与笔记,已经成为技术...
颠覆 AI 开发效率!开源工具一站式管控 30+大模型ApiKey,秘钥付费+负载均衡全搞定

颠覆 AI 开发效率!开源工具一站式管控 30+大模型ApiKey,秘钥付费+负载均衡全搞定

  颠覆 AI 开发效率!开源工具一站式管控 30+ 大模型 ApiKey,秘钥付费 + 负载均衡全...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级

让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级

让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级 大家好,我是星哥,之前写了一篇文章 自己手撸一...
还在找免费服务器?无广告免费主机,新手也能轻松上手!

还在找免费服务器?无广告免费主机,新手也能轻松上手!

还在找免费服务器?无广告免费主机,新手也能轻松上手! 前言 对于个人开发者、建站新手或是想搭建测试站点的从业者...