Java:比较int时==运算符是如何工作的?
给出以下Java代码: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
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或任何=
碰巧变成的东西。