Integer比较大小问题

看深入理解java虚拟机时候发现下面的代码比较:

public class TestClass {
    public static void main(String[] args) {
        Integer a = 1;
        Integer b = 2;
        Integer c = 3;
        Integer d = 3;
        Integer e = 128;
        Integer f = 128;
        Long g = 3L;
        System.out.println(c==d);
        System.out.println(e==f); 
        System.out.println(c==(a+b));
        System.out.println(c.equals(a+b));
        System.out.println(g==(a+b));
        System.out.println(g.equals(a+b));
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

上面代码在不看答案情况下大家可以试着回答一下,下面会贴出答案。在回答问题时候先看几点关于java“==”和equals方法的总结(大神可以略过),欢迎指正。

  1. 基本数据类型:byte,short,char,int,long,float,double,boolean。他们之间的比较,双等号(==),比较的是他们的值。
  2. 复合数据类型(类):当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址(确切的说,是堆内存地址)。
  3. 针对第二条需要注意:equals在一些类库当中这个方法被复写了,如String、Integer、Date。在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。 所以说,对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是内存中的存放位置的地址值。;如果被复写,按照复写的要求来。
  4. 常量缓存池缓存-128~127的整数,128是放在堆里的.
  5. 包装类的“==”运算在不遇到算数运算的情况下不会自动拆箱,他们的equals方法不处理数据转型的关系。

上面的答案为: 
true 
false 
true 
true 
true 
false

下面我们分析上面的结果:(欢迎指正) 
1. 对于池c==d和e==f,首先,java中Integer类型对于-128-127之间的数是常量缓存池取的,所以用等号比较是一致的。但对于不在这区间的数字是在堆中new出来的。所以地址空间不一样,也就不相等。因此c==d结果是true,e==f结果为false; 
2. 对于第三个c==(a+b),因为涉及了运算,比较时会进行自动拆箱,实际上是int类型数据在进行比较,比较的为值,因此结果为true。 
3. 对于c.equals(a+b),Integer的equals方法被重写了,(源码其实是对值进行比较),因此结果为true。 
4. 对于g==(a+b),因为涉及了运算,比较时会进行自动拆箱,实际上就是基本数据类型的比较,因此结果为true。 
5. 对于最后g.equals(a+b),我查看源码发现,equals方法会判断是否是相同的类型,a+b的结果不是Long类型,因此equals方法直接返回false。

原文:http://blog.csdn.net/starlh35/article/details/72695895

猜你喜欢

转载自blog.csdn.net/wang1046811344/article/details/79014116