Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:比较int时==运算符是如何工作的?_Java - Fatal编程技术网

Java:比较int时==运算符是如何工作的?

Java:比较int时==运算符是如何工作的?,java,Java,给出以下Java代码: int fst = 5; int snd = 6; if(fst == snd) do something; 我想知道Java如何比较这种情况下的等式。它会使用异或操作来检查相等性吗?您是在问“这会变成什么本机代码?”?如果是,答案是“执行部” 但是,如果您想知道使用了什么,只需查看生成的.class文件(例如用于反汇编)。如果您询问JVM,请使用javap程序 public class A { public static void main(Str

给出以下Java代码:

int fst = 5;
int snd = 6;

if(fst == snd)
    do something;
我想知道Java如何比较这种情况下的等式。它会使用异或操作来检查相等性吗?

您是在问“这会变成什么本机代码?”?如果是,答案是“执行部”


但是,如果您想知道使用了什么,只需查看生成的.class文件(例如用于反汇编)。

如果您询问JVM,请使用
javap
程序

public class A {

    public static void main(String[] args) {

        int a = 5;
        System.out.println(5 == a);

    }

}
以下是拆解:

public class A {
  public A();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: iconst_5
       1: istore_1
       2: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
       5: iconst_5
       6: iload_1
       7: if_icmpne     14
      10: iconst_1
      11: goto          15
      14: iconst_0
      15: invokevirtual #3                  // Method java/io/PrintStream.println:(Z)V
      18: return
}
公共A类{
公共A();
代码:
0:aload_0
1:invokespecial#1//方法java/lang/Object。“:()V
4:返回
公共静态void main(java.lang.String[]);
代码:
0:iconst_5
1:istore_1
2:getstatic#2//Field java/lang/System.out:Ljava/io/PrintStream;
5:iconst_5
6:iload_1
7:if_icmpne 14
10:iconst_1
11:goto 15
14:iconst_0
15:invokevirtual#3//方法java/io/PrintStream.println:(Z)V
18:返回
}
在这种情况下,它稍微优化了分支,并使用了
if\u icmpne
。在大多数情况下,它将使用
if\u icmpne
if\u icmpeq


if_icmpeq
如果int等于,则在branchoffset处分支到指令(有符号短指令由无符号字节branchbyte1构造而成)。否,它将执行
if_icmpeq
JVM字节码指令。@jsn对我来说,这听起来是一个很好的答案(嗯,也许稍微扩展了一点).
=
操作转换为字节码形式的
if_icmpeq
指令;在执行过程中,这会从操作数堆栈中弹出对象引用并对它们进行比较。如果比较整数(大写字母I,拼写出来),我还想添加这一点(我知道您没有问这个问题),它们是使用==相互关联的对象,用于比较它们是否是同一实例,而不是两个整数的值是否相同。因此,对于这些对象,您应该使用.equals。
如果icmpeq
从堆栈中弹出顶部的两个
整数并进行比较。如果两个整数相等,则执行分支到地址(
pc
+
branchoffset
),其中pc是字节码中if_icmpeq
操作码的地址,
branchoffset
是字节码中if_icmpeq
操作码后的一个16位有符号整数参数。如果整数不相等,则在下一条指令继续执行。+1绝对!如果不保留类似的判定“如何实现
int
equality”取决于JVM的编写者,他/她也可以为他们编写JVM:)非常感谢。我找到了我需要的东西。值得补充的是,您甚至可以看到JIT编译器生成的本机代码。在那里,您将最终能够看到您的XOR或CMP或任何
=
碰巧变成的东西。