来来来, 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. python特性

    # for用法 for i in range(0,100,2): print(i) n = 0 # while用法 while n < 100: print(n) n += 2 else: pr ...

  2. AcWing 1010. 拦截导弹

    //贪心加dp #include<iostream> using namespace std ; ; int n; int q[N]; int f[N]; int g[N];//存每个序列 ...

  3. java 字符+操作,字符串+操作

    字符额 “+” 操作 是拿字符在计算机底层对应的数值来进行计算的 ‘A’ = 65 A-Z是连续的 'a' = 97 a-z是连续的 '0' = 48 0-9是连续的 算数表达式中包含多个基本数据类型 ...

  4. win10中批量新建文件夹

    1.新建一个bat文件,如[批量新建.bat].或者新建txt文件,输入完内容后重命名为bat文件 2.建议用notepad软件打开文件,首先确定编码格式为ANSI编码 (否则最后出现的效果是乱码,不 ...

  5. 问题解决:局域网内,为啥别人ping不到我的IP

    试着在本地搭建一个测试环境,成功后却发现同一局域网的同事根本访问不了,他们ping不到我的IP,这可咋整! 询问度娘后,我的问题得到了,以下是我的总结,如果解决不了你的问题,还请继续百度. 方法一:关 ...

  6. eclipse的安装和环境配置

    一,eclipse下载 地址:https://www.eclipse.org/downloads/ 一般浏览器都有翻译功能 二.有32位和64位的版本根据自己的需求下载,选下载的选下载量最多的下载. ...

  7. 关于Win32串口

    因为近段时间接触Hid相对来说多一些,由此忽略了串口中获取cbInQue这个重要的东西,下面是错误代码 // Win32SerialPortLib.cpp : 定义 DLL 应用程序的导出函数. // ...

  8. python 操作 word 图片 消失

    问题描述修改word中文本,如下代码,保存时会导致word中的部分图片消失 from docx import Document path1 = 'test_in.docx' path2 = 'test ...

  9. 使用命令行生成动态库dll

    1.安装开发工具,比如visual studio或者mingw等等.下面以visual studio编译器cl作为讲解. 2.导出dll中的函数基本使用两种方式,可以使用关键字__declspec(d ...

  10. Docker常用命令及脚本

    1.常用命令 docker          search centos                                #搜索镜像              pull centos   ...