JAVA中Long与Integer

  

Long a=5L;
Long b=5L;
System.out.println(a==b);
Long c=200L;
Long d=200L;
System.out.println(c==d);

结果为 true false当时结果都说对了,并且说到了5的时候可能会涉及到jvm优化,但是也没说清楚。

原因

首先来看看 Long a = 5L ; 它是如何将一个基本类型long包装成一个对象Long的 。

 可以写一个测试类,然后反编译一下,看看java它是如何解析Long a = 5L这样一条命令的 。

测试类如下:

[java] view plaincopy在CODE上查看代码片

  1. public class Test06 {  

  2.     Long l = 3L;  

  3. }  

然后使用javap -verbose Test06 就能看到反编译的结果了, 下面是输出的部分:

[css] view plaincopy在CODE上查看代码片

  1. {  

  2. java.lang.Long l;  

  3.   

  4. public com.spring.test.Test06();  

  5.   Code:  

  6.    Stack=3, Locals=1, Args_size=1  

  7.    0:   aload_0  

  8.    1:   invokespecial   #10; //Method java/lang/Object."<init>":()V  

  9.    4:   aload_0  

  10.    5:   ldc2_w  #12; //long 3l  

  11.    8:   invokestatic    #14; //Method java/lang/Long.valueOf:(J)Ljava/lang/Long;  

  12.    11:  putfield        #20; //Field l:Ljava/lang/Long;  

  13.    14:  return  

  14.   LineNumberTable:  

  15.    line 3: 0  

  16.    line 5: 4  

  17.    line 3: 14  

  18.   

  19.   LocalVariableTable:  

  20.    Start  Length  Slot  Name   Signature  

  21.    0      15      0    this       Lcom/spring/test/Test06;  

  22.   

  23.   

  24. }  

从Code中的8可以看出调用了Long的一个类方法Long.valueOf(Long) , 所以可以得到的结论是Long a = 5L实际上等于 Long a = Long.valueOf(5) ;

然后再看看Long.valueOf()方法是如何定义的:

[java] view plaincopy在CODE上查看代码片

  1.  public static Long valueOf(long l) {  

  2. final int offset = 128;  

  3. if (l >= -128 && l <= 127) { // will cache  

  4.     return LongCache.cache[(int)l + offset];  

  5. }  

  6.        return new Long(l);  

  7.    }  

一目了然,会先判断基本类型的值如果在-128~127之间,就会直接从LongCache里面取出缓存的对象返回,否则就new一个新的Long对象返回 。


现在就不难理解Test05程序执行得到的结果了,因为a与b等于5,在-127~128之内,所以都是直接从LongCache里面返回的一个Long对象,所以他们在使用==比较的时候,就是相等的(对于对象类型来说,==比较的是两个对象的引用指向堆中的地址) ,而c与d等于129,不在-127~128之间,所以他们他们是分别new出来的两个新的Long对象,使用==来比较自然是不相等的了。


Long重写了equals方法:

[java] view plaincopy在CODE上查看代码片

  1.  public boolean equals(Object obj) {  

  2. if (obj instanceof Long) {  

  3.     return value == ((Long)obj).longValue();  

  4. }  

  5. return false;  

  6.    }  

它是先通过.longValue()方法获取Long对象的基本类型long的值之后再做比较的。

所以对于Integer与Long的比较,最好是使用equals来比较才能确保得到我们想要的结果。


Integer与Long一样,这里就不举例了。


你可能感兴趣的:(JAVA中Long与Integer)