​面试官疯了:while(true)和for(;;)哪个性能好?

news/2024/7/5 7:45:39

△Hollis, 一个对Coding有着独特追求的人△

5ac025a7b60bb76cdfc9a766d7585f75.jpeg

这是Hollis的第 427 篇原创分享

作者 l Hollis

来源 l Hollis(ID:hollischuang)

5e49c6159a9b3f7d830e820a8bb7115c.png

while(true)和for(;;)都是做无限循环的代码,他俩有啥区别呢?

我承认这个问题有点无聊,并且工作中也不会有人刻意的去考虑他们之间的性能差异,也不太会有人在做这个选择之间纠结。

但是,最近竟然有很多面试官开始问这个问题,所以,那就索性理性分析一波。

准备2段代码:

public class HollisTest {


    public static void main(String[] args) {
        for(;;){
            System.out.println("this is hollis testing....");
        }
    }
}
public class HollisTest {
    
    public static void main(String[] args) {
        while (true){
            System.out.println("this is hollis testing....");
        }
    }
}

关于这个问题,网上有很多讨论,说那么多没用,直接反编译,看看字节码有啥区别就行了。

分别将他们编译成class文件:

javac HollisTest.java

然后再通过javap对class文件进行反编译,然后我们就会发现,两个文件内容,一模一样!!!

Classfile /Users/hollis/workspace/chaojue/HLab/src/main/java/HollisTest.class
  Last modified 2023-6-18; size 463 bytes
  MD5 checksum 38eddb7d25748625d7c9aa377b6f66d3
  Compiled from "HollisTest.java"
public class HollisTest
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #6.#16         // java/lang/Object."<init>":()V
   #2 = Fieldref           #17.#18        // java/lang/System.out:Ljava/io/PrintStream;
   #3 = String             #19            // this is hollis testing....
   #4 = Methodref          #20.#21        // java/io/PrintStream.println:(Ljava/lang/String;)V
   #5 = Class              #22            // HollisTest
   #6 = Class              #23            // java/lang/Object
   #7 = Utf8               <init>
   #8 = Utf8               ()V
   #9 = Utf8               Code
  #10 = Utf8               LineNumberTable
  #11 = Utf8               main
  #12 = Utf8               ([Ljava/lang/String;)V
  #13 = Utf8               StackMapTable
  #14 = Utf8               SourceFile
  #15 = Utf8               HollisTest.java
  #16 = NameAndType        #7:#8          // "<init>":()V
  #17 = Class              #24            // java/lang/System
  #18 = NameAndType        #25:#26        // out:Ljava/io/PrintStream;
  #19 = Utf8               this is hollis testing....
  #20 = Class              #27            // java/io/PrintStream
  #21 = NameAndType        #28:#29        // println:(Ljava/lang/String;)V
  #22 = Utf8               HollisTest
  #23 = Utf8               java/lang/Object
  #24 = Utf8               java/lang/System
  #25 = Utf8               out
  #26 = Utf8               Ljava/io/PrintStream;
  #27 = Utf8               java/io/PrintStream
  #28 = Utf8               println
  #29 = Utf8               (Ljava/lang/String;)V
{
  public HollisTest();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 1: 0


  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=1, args_size=1
         0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
         3: ldc           #3                  // String this is hollis testing....
         5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
         8: goto          0
      LineNumberTable:
        line 5: 0
      StackMapTable: number_of_entries = 1
        frame_type = 0 /* same */
}
SourceFile: "HollisTest.java"

可以看到,两个用法,其实都是通过goto来干的,所以,这两者其实是没啥区别的。用哪个都行

有人愿意用while(true)因为他更清晰的看出来这里是个无限循环。有人愿意用for(;;),因为有些IDE对于while(true)会给出警告。至于你,爱用啥用啥!


本文内容节选自我最近出的Java面试宝典,上面的这几个问题,在宝典中也都能找到答案,类似的问题及答案还有600多道题。

我们会持续更新内容,争取做到全网最新、最全、最准确的Java后端面试宝典。

f20b0751dd3cc7782104162fff83bd0c.png

之前在我抖音号上面卖了几天。现在已经卖了几百份了,而且,没有中差评!(详细介绍:Java面试宝典详细介绍 )

34b69751754b797f48eaa69217e3538f.jpeg

因为要涨价了,所以,在公众号也发一下,弄了个微信小商店上面的链接,这个课程,是在线文档,永久更新的,并且没有时间限制。不需要你续费、也不需要二次消费。

大家可以通过下方二维码扫码购买,下单后根据短信提示申请权限并联系客服审批即可!

af207d11f6259413f2e29d6c8dcb0b0e.jpeg


http://lihuaxi.xjx100.cn/news/1265270.html

相关文章

Goby 漏洞发布|泛微E-office协同办公系统 download.php 文件 filename 参数文件读取漏洞

漏洞名称&#xff1a;泛微E-office协同办公系统 download.php 文件 filename 参数文件读取漏洞 English Name&#xff1a;maxView Storage Manager dynamiccontent.properties.xhtml RCE CVSS core: 5.0 影响资产数&#xff1a;4971 漏洞描述&#xff1a; 泛微E-office协同…

操作系统 复习-计算题

一. 计算题&#xff08;共5题&#xff0c;100分&#xff09; 1.(计算题) 假设有4个进程需要在单CPU上运行&#xff0c;它们的执行时间如下表所示&#xff1a; 进程ID执行时间P18P25P32P44 现在我们需要按照抢占式优先级调度算法来安排这些进程的执行顺序。其中&#xff0c;进…

推荐系统中的EE算法

人生中有很多选择问题&#xff0c;当每天中午吃饭的时候&#xff0c;需要选择吃饭的餐馆&#xff0c;那么就面临一个选择&#xff0c;是选择熟悉的好吃的餐馆呢&#xff0c;还是冒风险选择一个没有尝试过的餐馆呢。同样的&#xff0c;推荐系统处处也面临着这样的选择&#xff0…

关于nginx,正向代理和反向代理是什么意思

为什么要使用nginx 很多公司会用到nginx做代理服务器&#xff0c;为什么用nginx&#xff0c;tomcat服务器不行吗&#xff1f; tomcat缺点&#xff1a;并发量小&#xff0c;用户使用的少 nginx&#xff1a;高并发&#xff0c;高性能&#xff0c;cpu、内存等资源消耗却非常低&…

Triton教程 --- 速率限制器

Triton教程 — 速率限制器 Triton系列教程: 快速开始利用Triton部署你自己的模型Triton架构模型仓库存储代理模型设置优化动态批处理 速率限制器 速率限制器管理 Triton 在模型实例上调度请求的速率。 速率限制器在 Triton 中加载的所有模型上运行&#xff0c;以允许跨模型优…

冥想第八百二十七天

1.今天周日&#xff0c;还是在下雨&#xff0c;带着溪溪桐桐去了郑大&#xff0c;跑了800m&#xff0c;感觉真好呀 2.空气非常好&#xff0c;充实的一天。 3.感谢父母&#xff0c;感谢朋友&#xff0c;感谢家人&#xff0c;感谢不断进步的自己。

从0到1精通自动化测试,pytest自动化测试框架,生成html报告与html报告报错截图+失败重跑(五)

目录 一、生成html报告 1、pytest-html 2、html报告 3、指定报告路径 4、显示选项 5、更多功能 二、html报告报错截图失败重跑 1、conftest.py 2、报告展示 3、失败重试 一、生成html报告 1、pytest-html pytest-HTML是一个插件&#xff0c;pytest用于生成测试结果…

用python写一个接收数据的服务

import socket # 定义服务器地址和端口号 SERVER_HOST localhost SERVER_PORT 8000 # 创建服务器套接字 server_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定地址和端口号 server_socket.bind((SERVER_HOST, SERVER_PORT)) # 监听客户端连接 server_so…