首页 > 代码库 > java比较相等符

java比较相等符

public class Test1 {    /**     * @param args     */    public static void main(String[] args){        int a = 1000, b = 1000;        System.out.println(a == b);        Integer c = 1000, d = 1000;        System.out.println(c==d);        Integer e = 100, f = 100;        System.out.println(e == f);             }}运行结果:truefalsetrue结果分析:查看Test1.class文件如下:public class Test1 extends java.lang.Object{public Test1();  Code:   0:   aload_0   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V   4:   returnpublic static void main(java.lang.String[]);  Code:   0:   sipush  1000   3:   istore_1   4:   sipush  1000   7:   istore_2   8:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;   11:  iload_1   12:  iload_2   13:  if_icmpne       20   16:  iconst_1   17:  goto    21   20:  iconst_0   21:  invokevirtual   #3; //Method java/io/PrintStream.println:(Z)V   24:  sipush  1000   27:  invokestatic    #4; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;   30:  astore_3   31:  sipush  1000   34:  invokestatic    #4; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;   37:  astore  4   39:  getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;   42:  aload_3   43:  aload   4   45:  if_acmpne       52   48:  iconst_1   49:  goto    53   52:  iconst_0   53:  invokevirtual   #3; //Method java/io/PrintStream.println:(Z)V   56:  bipush  100   58:  invokestatic    #4; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;   61:  astore  5   63:  bipush  100   65:  invokestatic    #4; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;   68:  astore  6   70:  getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;   73:  aload   5   75:  aload   6   77:  if_acmpne       84   80:  iconst_1   81:  goto    85   84:  iconst_0   85:  invokevirtual   #3; //Method java/io/PrintStream.println:(Z)V   88:  return}由上述字节码我们可以看出 int a = 1000, b = 1000;System.out.println(a == b);执行的是if_icmpne命令,比较的是2个int值是否相等。在此返回为true。而 Integer c = 1000, d = 1000;System.out.println(c==d);执行的是if_acmpne命令,比较的是对象引用地址。查看jdk源码    public static Integer valueOf(int i) {    final int offset = 128;    if (i >= -128 && i <= 127) { // must cache        return IntegerCache.cache[i + offset];    }        return new Integer(i);    }此时的值为1000,不在-128~127范围内。所以变量c和d是2个不同的对象。因此System.out.println(c==d);返回结果为false。而 Integer e = 100, f = 100;System.out.println(e == f);  用的是Integer缓存中的同一对象,因此返回结果为true。

今天又是学习了。。。以前没有注意这个问题

转载与:http://blog.csdn.net/jeamking/article/details/6883623

java比较相等符