来来来, for(; vs. while(true) 有什么区别?从java的语义上来说,他们是一模一样的。为何怎么说?

开始我们先测试for(;

package com.tony.test;
import org.junit.Test;
/**
* 测试循环
*
* @author tony
* @create 2019-12-26 10:43
**/
public class LoopTest {
@Test
public void testFor() {
for (; ; ) {
System.out.println("Tony Teacher test for");
}
}
}

输出的字节码如下

// class version 51.0 (51)
// access flags 0x21
public class com/tony/test/LoopTest {
// compiled from: LoopTest.java
// access flags 0x1
public <init>()V
L0
LINENUMBER 11 L0
ALOAD 0
INVOKESPECIAL java/lang/Object.<init> ()V
RETURN
L1
LOCALVARIABLE this Lcom/tony/test/LoopTest; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1 // access flags 0x1
public testFor()V
@Lorg/junit/Test;()
L0
LINENUMBER 16 L0
FRAME SAME
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
LDC "Tony Teacher test for"
INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
GOTO L0
L1
LOCALVARIABLE this Lcom/tony/test/LoopTest; L0 L1 0
MAXSTACK = 2
MAXLOCALS = 1
}

我们再测试while (true)

package com.tony.test;
import org.junit.Test;
/**
* 测试循环
*
* @author tony
* @create 2019-12-26 10:43
**/
public class LoopTest {
@Test
public void testWhile() {
while (true) {
System.out.println("Tony Teacher test while");
}
}
}

输出的字节码如下

// class version 51.0 (51)
// access flags 0x21
public class com/tony/test/LoopTest {
// compiled from: LoopTest.java
// access flags 0x1
public <init>()V
L0
LINENUMBER 11 L0
ALOAD 0
INVOKESPECIAL java/lang/Object.<init> ()V
RETURN
L1
LOCALVARIABLE this Lcom/tony/test/LoopTest; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1 // access flags 0x1
public testFor()V
@Lorg/junit/Test;()
L0
LINENUMBER 16 L0
FRAME SAME
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
LDC "Tony Teacher test while"
INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
GOTO L0
L1
LOCALVARIABLE this Lcom/tony/test/LoopTest; L0 L1 0
MAXSTACK = 2
MAXLOCALS = 1
}

引用网上的一段话

Semantically, they're completely equivalent. It's a matter of taste, but I think while(true) looks cleaner, and is easier to read and understand at first glance. In Java neither of them causes compiler warnings.
At the bytecode level, it might depend on the compiler and the level of optimizations, but in principle the code emitted should be the same.

这个两种写法都是可以的,取决于编译器和优化的级别,原则上是一模一样的。

下次面试官再问你这种问题,你就可以怼回去。通过ASM,查看byteCode码。这两货是一模一样的。对我而言,我喜欢用for(;;),感觉for里面肯定会有退出循环的情况,

但是while(true),咋一看会感觉一直会循环下去。
只是看个人喜欢,你喜欢用那种写法呢?

再讲讲 while(true)

当你使用一个空循环的时候,你观察一下不一会你的CPU使用率就达到100%,如何不让CPU使用达到100%?此刻如果面试官问你,你该怎么回答?
Thread.sleep , 对的sleep方法。因为while 会消耗掉所有可以的计算资源。你此刻如果生成dump文件,你会发现jvm垃圾回收时间是很频繁的。

while (true)
{
try
{
Thread.sleep(500);
}
catch (Exception e)
{
e.printStackTrace();
}
}

500毫秒毫秒循环一次,你可别小看这500毫秒。你可知道一毫秒cpu可以做很多的事情了。此刻你线程等待,可以让cpu去干其他的事情了。

你猜对了答案吗?其实这些问题,我们平常看源码都看到过。但是你有没有去总结为什么这么写?知其然更知其所以然。IT这条路是漫长、孤独且枯燥,需要静下心来好好琢磨学习。坚持下来,你一定会享受到编码带来的快乐和财富。

扫一扫关注下,更多分享等着你。

『托尼老师』从事互联网研发工作10+年,经历过大大小小公司的洗礼。定期分享技术的文章,希望各位同僚关注我,我们一起探讨技术人生!

你知道for(;;) vs. while(true)那个更快吗?的更多相关文章

  1. for (;;) 与 while (true),哪个更快?

    Java技术栈 www.javastack.cn 优秀的Java技术公众号 在 JDK8u 的 jdk 项目下做个很粗略的搜索: mymbp:/Users/me/workspace/jdk8u/jdk ...

  2. Java 里的 for (;;) 与 while (true),哪个更快?

    在 JDK8u 的 jdk 项目下做个很粗略的搜索: mymbp:/Users/me/workspace/jdk8u/jdk/src$ egrep -nr "for \\(\\s?;\\s? ...

  3. 新型序列化类库MessagePack,比JSON更快、更小的格式

    MessagePack is an efficient binary serialization format. It lets you exchange data among multiple la ...

  4. 让你的 Node.js 应用跑得更快的 10 个技巧(转)

    Node.js 受益于它的事件驱动和异步的特征,已经很快了.但是,在现代网络中只是快是不行的.如果你打算用 Node.js 开发你的下一个Web 应用的话,那么你就应该无所不用其极,让你的应用更快,异 ...

  5. 让你的 Node.js 应用跑得更快的 10 个技巧

    Node.js 受益于它的事件驱动和异步的特征,已经很快了.但是,在现代网络中只是快是不行的.如果你打算用 Node.js 开发你的下一个Web 应用的话,那么你就应该无所不用其极,让你的应用更快,异 ...

  6. SharePoint 2010中使用SPListItemCollectionPosition更快的结果

    转:http://www.16kan.com/article/detail/318657.html Introduction介绍 In this article we will explore the ...

  7. 利用更快的r-cnn深度学习进行目标检测

    此示例演示如何使用名为“更快r-cnn(具有卷积神经网络的区域)”的深度学习技术来训练对象探测器. 概述 此示例演示如何训练用于检测车辆的更快r-cnn对象探测器.更快的r-nnn [1]是r-cnn ...

  8. 比NGINX更快:nginx-1.15.5 vs mongols-1.2.3

    nginx是多进程web服务器的优秀代表. 本文要用mongols-1.2.3实现一个比nginx更快的多进程的web服务器. mongols是C++ 服务器基础设施库, 它的主要特性如下: tcp ...

  9. [20190219]那个更快(11g).txt

    [20190219]那个更快(11g).txt --//前几天测试11g Query Result Cache RC Latches时,链接http://blog.itpub.net/267265/v ...

随机推荐

  1. AE 打开Shp文件

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  2. C# asp.net 配置文件连接sql 数据库

    先引用 using System.Configuration;//配置文件using System.Data.SqlClient; 我这里使用的是SqlServer 2008  sa 用户 密码也为s ...

  3. mysql 对数据的自增ID重新进行排序

    创建表格时添加: create table table1(id int auto_increment primary key,...) 创建表格后添加: 删除原有主键: ALTER TABLE `ta ...

  4. 图的最短路径算法-- Floyd算法

    Floyd算法求的是图的任意两点之间的最短距离 下面是Floyd算法的代码实现模板: ; ; // maxv为最大顶点数 int n, m; // n 为顶点数,m为边数 int dis[maxv][ ...

  5. ansible笔记(13):变量(二)

    1.谈一谈[Gathering Facts]:使用setup模块查看 当我们运行一个playbook时,默认都会运行一个名为“[Gathering Facts]”的任务,前文中已经大致的介绍过这个默认 ...

  6. 【转】mathnet 使用方法介绍

    转载自:http://blog.csdn.net/c914620529/article/details/50393223 在C#中使用mathnet,需要利用using引入相关类 矩阵运算的相关类: ...

  7. MIPS中的syscall用法

  8. python如何离线装包 离线如何部署python环境

    1,安装python windows: 我用的是python3.6.6.exe安装包,需要提前下载好 ubuntu: 自带的python,如果是ubuntu18.04的话,自带的应该是3.6.8 2, ...

  9. Python爬取ithome的一所有新闻标题评论数及其他一些信息并存入Excel中。

    # coding=utf-8 import numpy as np import pandas as pd import sys from selenium import webdriver impo ...

  10. JS高级---闭包小案例

    闭包小案例 普通的函数 //普通的函数 function f1() { var num = 10; num++; return num; } console.log(f1()); //11 conso ...