关于某道Java面试题的小小思考—事情不是想象的那么简单,也不会像想象中那样复杂

做Java有几年了,最近重新找了一下Java的面试题,看了一下,虽然在平常中使用颇多,但有部分“概念”模糊了,甚至忘记了,不过,这里不讨论忘记的,只说说一道看似简单的面试题。

“用最有效率的方法算出2乘以8等于多少”?

最初看到这个题,第一感觉就是:8<<1,即左移一位,就是乘以2,相反,在某种情况下,右移一位就是除以2。对了了“面试题答案”,发现其答案的思路一样都是采用移位的方式,但是具体答案是:2<<3。汇编指令已记不太清了,不过感觉移一位总会比移3位更快吧~

为了验证自己的想法,我写了个简单的Java代码,分别是:

public class XiDiGe{
public static void main(String xdg[]){
int x=2<<3;
}
}

 

public class XiDiGe{
public static void main(String xdg[]){
int x=8<<1;
}
}

编译后,用jd-gui查看,发现得到的反编译结果居然是一样的,都是:

public class XiDiGe
{
public static void main(String[] paramArrayOfString)
{
int i = 16;
}
}

如上面所示,移位代码都变成了数值了。

带着疑问好好查找了相关的资料,得到的答案就是:编译优化了。到这里还没有完,好奇的我,继续尝试了2*8的情况,得到的反编译也是跟上面的一样。所以,其实2<<3或8<<1,甚至2*8的效果都一样,都在编译阶段被直接换成了结果值。

综上所述,也就是这道题的答案并非是这样的“2<<3或8<<1就对,2*8就不对”

» 本文链接地址:https://www.xidige.com/650

打开支付宝扫一扫,即可进行扫码打赏哦

扫码支持
扫码打赏,你说多少就多少

标签:

分享到:

扫一扫 在手机阅读、分享本文

上一篇: 下一篇:
评论区0人评论307人参与

电子邮件地址不会被公开。 必填项已用*标注

*

loading

赞助商广告