java 中的while(true)和for(;;)的区别

本文深入探讨了Looper源码中for(;;)循环与while(true)循环的区别,通过对比两者编译后的汇编指令,揭示了for(;;)指令更简洁、高效的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天研读Handler源码的时候发现在Looper死循环里面对消息循环的代码是这样子写的

public static void loop() {

    //获得一个 Looper 对象
    final Looper me = myLooper();

    // 拿到 looper 对应的 mQueue 对象
    final MessageQueue queue = me.mQueue;

    //死循环监听(如果没有消息变化,他不会工作的) 不断轮训 queue 中的 Message
    for (;;) {
        // 通过 queue 的 next 方法拿到一个 Message
        Message msg = queue.next(); // might block
        //空判断
        if (msg == null)return;
        //消息分发   
        msg.target.dispatchMessage(msg);
        //回收操作  
        msg.recycleUnchecked();
    }
}

循环为什么不用While呢? forwhile有什么区别呢?

对比了一下两者区别:
while
编译前:

while (true);  

编译后:

mov     eax,1 
test    eax,eax 
je      wmain+29h 
jmp     wmain+1Eh  

编译前:

   for(;;);

编译后:

jmp     wmain+29h       

由上面的结果可以看出
for编译器会优化成一条汇编指令,而while编译器会有很多条汇编指令

结果:for ( ; ; )指令少,不占用寄存器,而且没有判断、跳转

弄明白这里的区别,就知道Looper里面的loop为什么要使用for(;;)而不是while

<think>好的,用户现在问的是Javawhilefor循环区别。之前他问过else能否留空,现在转向循环结构,可能是想更深入理解控制流。 首先,我需要回忆Java的基本语法。whilefor都是循环,但结构不同。用户可能知道基础,但想了解区别,或者在实际编码中遇到了选择困难。 需要明确两者的语法结构。while循环只有条件判断,初始化通常在之前,循环变量更新在体内。而for循环将初始化、条件更新都放在头部。这可能导致不同的使用场景,比如当循环次数明确时用for,不明确时用while。 还要考虑使用场景的例子,比如遍历数组用for更合适,而读取输入直到满足条件用while更自然。同时,要注意到forwhile可以互相转换,但代码可读性不同。 用户可能想知道何时选择哪种循环。需要强调代码可读性维护性,比如for循环把所有控制集中在头部,结构清晰。而while适合条件复杂的情况,比如依赖多个变量变化。 还要注意无限循环的写法区别,比如for(;;)while(true),并提到增强型for循环foreach)在处理集合时的便利性。 最后,总结对比表,帮助用户一目了然地看到区别。要确保语言简洁,例子明确,避免术语过多,让不同水平的用户都能理解。</think>在Java中,`while``for`都是循环结构,但它们的语法适用场景有显著区别。以下是详细对比: --- ### **1. 语法结构对比** | **循环类型** | **语法** | **核心组成部分** | |--------------|-------------------------------------------|--------------------------------------| | `while` | ```while (条件) {<br> 循环体<br>}``` | 仅依赖单一条件判断(可与其他变量配合) | | `for` | ```for (初始化; 条件; 更新) {<br> 循环体<br>}``` | 集成初始化、条件判断变量更新 | --- ### **2. 核心区别** #### **(1) **控制变量的作用域** - **`for`循环** 初始化语句中定义的变量仅作用于循环内部: ```java for (int i = 0; i < 5; i++) { // i 只在循环内可见 } // System.out.println(i); ❌ 编译错误 ``` - **`while`循环** 变量需在循环外定义,作用域更广: ```java int i = 0; while (i < 5) { i++; } System.out.println(i); // ✅ 输出5 ``` --- #### **(2) **代码可读性** - **`for`循环** 将循环次数、终止条件变量更新集中在一行,适合**已知循环次数**的场景(例如遍历数组): ```java for (int i = 0; i < array.length; i++) { System.out.println(array[i]); } ``` - **`while`循环** 适合**条件复杂或未知循环次数**的场景(例如读取输入直到特定值出现): ```java Scanner scanner = new Scanner(System.in); while (!scanner.hasNext("exit")) { String input = scanner.next(); } ``` --- #### **(3) **灵活性差异** - **`while`循环** 可自由控制循环变量更新(甚至不更新),但需手动管理: ```java int i = 10; while (i > 0) { if (i % 2 == 0) i -= 2; // 选择性更新 else i--; } ``` - **`for`循环** 更新操作通常固定(如 `i++`),但可通过修改步长调整: ```java for (int i = 0; i < 100; i += 5) { ... } ``` --- ### **3. 特殊场景** #### **(1) 无限循环** - **`while`实现**:`while (true) { ... }` - **`for`实现**:`for (;;) { ... }` #### **(2) 增强型`for`循环** 专门用于遍历集合或数组(无需索引): ```java for (String item : list) { System.out.println(item); } ``` --- ### **4. 总结对比表** | **特征** | `for`循环 | `while`循环 | |----------------|------------------------------------|---------------------------------| | **适用场景** | 已知循环次数或明确迭代范围 | 未知循环次数或复杂条件控制 | | **变量管理** | 自动初始化、更新 | 需手动初始化、更新 | | **代码紧凑性** | 高(逻辑集中) | 低(逻辑分散) | | **典型用例** | 遍历数组、固定次数的重复操作 | 监听事件、条件依赖外部输入的操作 | --- ### **5. 如何选择?** - 如果循环次数明确 → **优先用`for`** - 如果条件依赖外部变化或需要灵活控制 → **用`while`** - 需要遍历集合元素 → **用增强型`for`**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值