java 字节码-Java逻辑运算的字节码

问题描述

Java逻辑运算的字节码

测试代码如下:

 public class TestXLogic {

    public boolean xand (boolean b1, boolean b2) {
        return b1 && b2;
    }

    public boolean xor (boolean b1, boolean b2) {
        return b1 || b2;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        TestXLogic logic = new TestXLogic();

        boolean b1 = true, b2 = false;

        if (logic.xand(b1, b2) || logic.xor(b1, b2) && b2 ) {
            System.out.println("haha");
        }
    }

}

编译后,main方法里if条件部分是这样的:

 15  invokevirtual com.dicp.flow.test.TestXLogic.xand(boolean, boolean) : boolean [24]
    18  ifne 34
    21  aload_1 [logic]
    22  iload_2 [b1]
    23  iload_3 [b2]
    24  invokevirtual com.dicp.flow.test.TestXLogic.xor(boolean, boolean) : boolean [26]
    27  ifeq 42
    30  iload_3 [b2]
    31  ifeq 42
    34  getstatic java.lang.System.out : java.io.PrintStream [28]
    37  ldc <String "haha"> [34]

为什么18行会是ifne 34呢?实际上这里哪怕执行了15行,结果是true,但还需要运行后面&& b2才得到最终结果,而不应该是直接跳到34输出

解决方案

|| 是**短路**或运算,只要 xand() 为真就执行 println(),很正确啊。

解决方案二:

||和&&不是平级的,&&要高于||的运算级别,因此是先执行的后面的判断,结果为logic.xor(b1, b2) && b2先判断为false,再与前面的false判断,还是false。

解决方案三:

只要 xand() 为真就执行 println()

时间: 2016-05-18

java 字节码-Java逻辑运算的字节码的相关文章

微信公众平台java开发关于微信扫描二维码的问题

问题描述 微信公众平台java开发关于微信扫描二维码的问题 某微信用户已经关注了我的公众号,然后他扫描了我公众平台的一个二维码,我想获取他的用户名,要怎么做?扫描二维码,是一个触发事件吗? 感谢各位了! 解决方案 他如果仅仅只是扫描的话,你是看不到他的用户名的.但是如果他关注了你的公众号,你在公众平台的用户管理里,是可以看到他的用户名信息的.希望能够帮到你. 解决方案二: 这个问题我自己研究的差不多了.用微信自己的扫一扫功能是不可能将事件推送给自己的公众平台的,我想它是推送事件给微信的公众平台了

Java集合源码剖析:Hashtable源码剖析

Hashtable简介 Hashtable同样是基于哈希表实现的,同样每个元素是一个key-value对,其内部也是通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长. Hashtable也是JDK1.0引入的类,是线程安全的,能用于多线程环境中. Hashtable同样实现了Serializable接口,它支持序列化,实现了Cloneable接口,能被克隆. HashTable源码剖析 Hashtable的源码的很多实现都与HashMap差不多,源码如下(加入了比较详细的注释):

Java集合源码剖析:HashMap源码剖析

HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长. HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap. HashMap 实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆. HashMap源码剖析 HashMap的源码如下(加入了比较详细的注释): pac

Java集合源码剖析:Vector源码剖析

Vector简介 Vector也是基于数组实现的,是一个动态数组,其容量能自动增长. LinkedList是JDK1.0引入了,它的很多实现方法都加入了同步语句,因此是线程安全的(其实也只是相对安全,有些时候还是要加入同步语句来保证线程的安全),可以用于多线程环境. LinkedList没有丝线Serializable接口,因此它不支持序列化,实现了Cloneable接口,能被克隆,实现了RandomAccess接口,支持快速随机访问. Vector源码剖析 Vector的源码如下(加入了比较详

Java集合源码剖析:ArrayList源码剖析

ArrayList简介 ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存. ArrayList不是线程安全的,只能用在单线程环境下,多线程环境下可以考虑用Collections.synchronizedList(List l)函数返回一个线程安全的ArrayList类,也可以使用concurrent并发包下的CopyOnWriteArrayList类. ArrayList实现了Serializable接口,因此它支持序列化,能够通过

Java集合源码剖析:LinkedList源码剖析

LinkedList简介 LinkedList是基于双向循环链表(从源码中可以很容易看出)实现的,除了可以当做链表来操作外,它还可以当做栈.队列和双端队列来使用. LinkedList同样是非线程安全的,只在单线程下适合使用. LinkedList实现了Serializable接口,因此它支持序列化,能够通过序列化传输,实现了Cloneable接口,能被克隆. LinkedList源码剖析 LinkedList的源码如下(加入了比较详细的注释): package java.util; publi

深入Java编程:Java的字节代码

Java程序员很少注意程序的编译结果.事实上,Java的字节代码向我们提供了 非常有价值的信息.特别是在调试排除Java性能问题时,编译结果让我们可以更 深入地理解如何提高程序执行的效率等问题.其实JDK使我们研究Java字节代码变 得非常容易.本文阐述怎样利用JDK中的工具查看解释Java字节代码,主要包含以 下方面的一些内容: l Java类分解器--javap l Java字节代码是怎样使程序 避免程序的内存错误 l 怎样通过分析字节代码来提高程序的执行效率 l 利用第三方工具反编译Jav

java调用控制台命令进行文件转码问题

问题描述 java调用控制台命令进行文件转码问题 public static String mxf2ts(File fileString fileName){ String mxfFilePath = """"""+file.getPath()+"""""";// mxf文件 String tsFilePath = """"""

java-求Pareto蚁群算法的源码 Java的

问题描述 求Pareto蚁群算法的源码 Java的 求Pareto最优化和蚁群算法相结合的算法的源码,即Pareto蚁群算法 Java的