你真的了解For循环吗?一道For循环Java面试题引发的思考

转载 2017年11月18日 00:00:00
一,疑问

最近群友抛出了一个面试题,就是下图中的第二题,是关于一个for循环的执行结果的问题,他的代码的执行结果是什么呢? 

640?wx_fmt=png&wxfrom=5&wx_lazy=1


二,代码复现

下面的例子和面试题上面的大同小异,是个非常简单的例子。首先这个代码是可以编译通过的,也可以正常执行的。那么执行结果是什么呢?会跟我们猜想的一样吗?

/**
 * Created by baiguantao on 2017/10/20.
 */
public class T {
public  static boolean  testA(char a){ System.out.print(a);
return true; } /**     * for循环的一些疑问     * @param args     */ public static void main(String[] args) {
int i=0;
for (testA('a');testA('b')&&(i<2);testA('c')) { i++; testA('d'); } } }
  • 执行结果

          abdcbdcb

那么问题来了,为什么是这个结果呢?我们可以借助javap命令反编译我们刚才编译的T.class进行分析。 如果对jvm不了解的可以参阅JVM基础


三,反编译

先贴出原版的字节码反编译后的代码,后边会对反编译的文件进行逐行解析,那么我们先来看看上述类反编译后的样子吧。如下所示:

C:\Users\temp\IdeaProjects\mix_learn\target\classes>
javap -c T.class
Compiled from "T.java"
public class T {
public T(); Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: returnpublic static boolean testA(char); Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 3: iload_0
4: invokevirtual #3 // Method java/io/PrintStream.print:(C)V 7: iconst_1
8: ireturn
public static void main(java.lang.String[]); Code:
0: iconst_0
1: istore_1
2: bipush 97 4: invokestatic #4 // Method testA:(C)Z 7: pop 8: bipush 98 10: invokestatic #4 // Method testA:(C)Z 13: ifeq 39 16: iload_1
17: iconst_2
18: if_icmpge 39 21: iinc 1, 1 24: bipush 100 26: invokestatic #4 // Method testA:(C)Z 29: pop 30: bipush 99 32: invokestatic #4 // Method testA:(C)Z 35: pop 36: goto 8 39: return
}

说明版本

对反编译后的文件是不是一脸懵逼,没太看懂是什么意思呢?没关系,下面我们进行逐行分析。

C:\Users\temp\IdeaProjects\mix_learn\target\classes>
javap -c T.class
Compiled from "T.java"
public class T {
public T(); // 这里是默认生成的无参构造函数部分开始
Code:
0: aload_0 //表示对this的操作 1: invokespecial #1 // Method java/lang/Object."<init>":()V   调用特殊实例方法 4: return // 返回结果 // 这里是默认生成的无参构造函数部分结束 public static boolean testA(char);// 这里是我们写入的静态方法 Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;   System.out调用类方法 3: iload_0 //从局部变量表中加载int型的数据到操作数栈 4: invokevirtual #3 // Method java/io/PrintStream.print:(C)V  调用实例方法 7: iconst_1 //int类型0进栈 8: ireturn // 返回结果 public static void main(java.lang.String[]); Code:
0: iconst_0 //int类型0进栈 1: istore_1 // int类型1出栈 2: bipush 97 // byte型常量97(a)进栈 4: invokestatic #4 // Method testA:(C)Z  执行静态方法testA 7: pop // 栈顶数值出栈(不能是long/double) 8: bipush 98 // byte型常量98(b)进栈 10: invokestatic #4 // Method testA:(C)Z  执行静态方法testA 13: ifeq 39 //判断语句  是否相等  循环结束 跳转到39 16: iload_1 //从局部变量表中加载int型的数据到操作数栈 17: iconst_2 //int类型2进栈 18: if_icmpge 39 //比较栈顶两int型数值大小,当结果大于等于0时跳转到39的位置 21: iinc 1, 1 //给局部变量表的1号位置的int值增加1 24: bipush 100 // byte型常量100(d)进栈 26: invokestatic #4 // Method testA:(C)Z  执行静态方法testA 29: pop // 栈顶数值出栈(不能是long/double) 30: bipush 99 // byte型常量99(c)进栈 32: invokestatic #4 // Method testA:(C)Z 执行静态方法testA 35: pop // 栈顶数值出栈(不能是long/double) 36: goto 8 // 重新循环 到8的位置 39: return //退出循环
}
  • 流程图

整体上的结构:

0?wx_fmt=png

for循环执行流程

0?wx_fmt=png

四,总结

从反编译文件以及流程图中我们可以看出for循环执行的顺序是:

  • testA(a)

  • testA('b')

  • testA('d')

  • testA('c')

  • testA('b')

  • testA('d')

  • testA('c')

  • testA('b')

所以我们的执行输出结果是:abdcbdcb

五,最后

本次投稿作者:ricky,java领域专家!

更多精彩,请戳除破这里:https://my.oschina.net/lt0314

推荐阅读:2T架构师教学视频分享

0?wx_fmt=png0?wx_fmt=png

架构师小秘圈,聚集10万架构师的小圈子!不定期分享技术干货,行业秘闻!汇集各类奇妙好玩的话题和流行动向!长按左侧图片,扫码加入架构师微信群!

java面试题十五 for循环一个题目

  • jianfpeng241241
  • jianfpeng241241
  • 2015年09月25日 23:32
  • 1421

你真的了解For循环吗?一道For循环Java面试题引发的思考

疑问 最近群友抛出了一个面试题,就是下图中的第二题,是关于一个for循环的执行结果的问题,他的代码的执行结果是什么呢?  代码复现 下面的例子和面试题上面的大同小异,是个非常...
  • u014042066
  • u014042066
  • 2017年10月23日 11:53
  • 1088

一道经典的for循环笔试题

code: public class test { static boolean foo(char c) { System.out.print(c);...
  • qianquan3
  • qianquan3
  • 2014年03月13日 17:23
  • 2438

一道简单的题目引发的思考

转载:http://www.cnblogs.com/skynet/archive/2010/07/11/1775084.html 一道简单的题目引发的思考 2010-07-11 05:42 b...
  • u014472726
  • u014472726
  • 2016年02月01日 14:48
  • 167

经典for循环面试题

public class Example01 { public static void main(String[] args) { int i = 0; for(...
  • qq_33624284
  • qq_33624284
  • 2016年12月13日 08:37
  • 836

细思极恐-你真的会写java吗?

细思极恐-你真的会写java吗? 导语 自2013年毕业后,今年已经是我工作的第4个年头了,总在做java相关的工作,终于有时间坐下来,写一篇关于java写法的一篇文章,来探讨一下如果你真的是一个...
  • sinat_32366329
  • sinat_32366329
  • 2017年03月12日 15:18
  • 1248

钱柜娱乐开户消息机制,你真的了解Handler吗?

今日快讯 近日,工业和信息化部公布了第三季度对55家手机应用商店中应用软件的技术检测结果:发现违规软件31款,涉及违规收集使用用户个人信息、恶意“吸费”、强行捆绑推广其他应用软件等问题。...
  • c10WTiybQ1Ye3
  • c10WTiybQ1Ye3
  • 2017年11月17日 00:00
  • 193

javascript经典面试题之for循环click

经典重现 html lang="en"> head> meta charset="utf-8"> title>title> script type="text/...
  • a32524150195
  • a32524150195
  • 2017年03月10日 17:30
  • 918

你的for循环真的高效吗——优化for循环第二章

我始终相信,人类最伟大的发明就是汽车和计算机,对于一部汽车,我们如果不经过专业的了解汽车内部结构的工程师调试,就算你是保时捷,也达不到理想的速度。对于计算机来说,我始终觉得,我们很多人只是明白程序的写...
  • zhengzhoudaxue2
  • zhengzhoudaxue2
  • 2011年06月01日 18:37
  • 18631

for循环,你真的用过这样的for循环吗?

for循环,啥也不说了,都是眼泪!
  • cadi2011
  • cadi2011
  • 2016年06月08日 21:09
  • 280
收藏助手
不良信息举报
您举报文章:你真的了解For循环吗?一道For循环Java面试题引发的思考
举报原因:
原因补充:

(最多只允许输入30个字)