来来来, 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. jenkins pipline 如何禁止任务并行

    背景: 我测试的一个项目CI包括好几个步骤,但是有的步骤是不能并行的,否则会互相影响 处理过程: [方案一]:不推荐此方案 在每个步骤里面的shell脚本中加进程判断 示例:比如本任务有4个步骤,第2 ...

  2. 《深入理解Java虚拟机》读书笔记七

    第八章 虚拟机字节码执行引擎 1.运行时栈帧结构 概述: 栈帧是用于支持虚拟机进行方法调用的和方法执行的数据结构,他是虚拟机运行时数据区中的虚拟机栈的栈元素,栈帧存储了方法的局部变量,操作数栈,动态连 ...

  3. Anaconda多环境Python

    1. Create a new environment for 32bit Python 2.7: set CONDA_FORCE_32BIT=1 conda create -n py27_32 py ...

  4. 关于jquery绑定事件执行两次

    经常会出现jquery绑定事件执行两次的情况,如: $("a[tag=slide]").click(function () { alert(1); $(this).parent() ...

  5. appium---webview(H5)元素定位

    我们在做UI自动化的时候,肯定需要元素定位,那么webview(H5)的元素怎么定位呢? webview定位方法 方法一: 1.打开chrome浏览器,输入chrome://inspect 2.连接手 ...

  6. 第四十二篇 入门机器学习——Numpy的基本操作——索引相关

    No.1. 使用np.argmin和np.argmax来获取向量元素中最小值和最大值的索引 No.2. 使用np.random.shuffle将向量中的元素顺序打乱,操作后,原向量发生改变:使用np. ...

  7. STM32F103之DMA学习记录

    /================翻译STM32F103开发手册DMA章节===========================/ 13 DMA(Direct memory access) 13.1 ...

  8. 「题解」「CF1019B」The hat

    目录 题目 背景 程序输出 交互程序输入 题解 程序 题目 背景 这是一道交互题. 一共有 \(n\) 个人做成一圈,他们的编号从 \(1\) 到 \(n\). 现在每个人的手里面都有一个数字 \(a ...

  9. 查看和清理相关yum安装应用--例如docker包

    查看和清理相关yum安装应用--例如docker包 待办 https://blog.csdn.net/CSDN_duomaomao/article/details/78997138

  10. beego登录退出与检查登录过滤器

    // ShowLogin 登陆显示 func (c *UserController) ShowLogin() { username := c.Ctx.GetCookie("username& ...