zoukankan      html  css  js  c++  java
  • JAVA中Integer类型变量比较问题

      今天在做实验的时候,发现了一个比较奇怪的问题:两个Integer型变量用==进行比较时,有时候能成功有时候不能成功。举个例子:

    代码1:

    Integer l1 = 122;
    Integer l2 = 122;
    if(l1 == l2)
        System.out.println("Right");
    else
        System.out.println("Wrong");
    

      

      运行这段代码时,程序会输出:Right。对于另一个例子:

    代码2:

    Integer l1 = 233;
    Integer l2 = 233;
    if(l1 == l2)
        System.out.println("Right");
    else
        System.out.println("Wrong");
    

      

      运行这段代码时,程序会输出Wrong。但当对代码2进行修改时:

    代码3:

    Integer l1 = 233;
    int l2 = 233;
    if(l1 == l2)
        System.out.println("Right");
    else
        System.out.println("Wrong");
    

      在运行这段代码时,程序会输出Right。如果换一种定义方式时:

    代码4:

    Integer l1 = 233;
    Integer l2 = new Integer(233);
    if(l1 == l2)
        System.out.println("Right");
    else
        System.out.println("Wrong");
    	
    

     运行这段代码时,程序会输出Wrong。

    关于这种现象,查了下资料,总结如下:

     1.实际上Java中定义的Integer变量会通过Integer.valueOf()方法生成一个实例,即:

    Integer l1 = 122 会被编译成 Integer l1 = Integer.valueOf(122),而关于valueOf()方法的源码:

    public static Integer valueOf(int i) {
             assert IntegerCache.high >= 127;
             if (i >= IntegerCache.low && i <= IntegerCache.high)
                 return IntegerCache.cache[i + (-IntegerCache.low)];
             return new Integer(i);
         }
    

    看一下源码就会明白,对于-128到127之间的数,会进行缓存,Integer l1 = 122时,会将122进行缓存,下次再写Integer l2 = 122时,就会直接从缓存中取,就不会new了,相当于生成的为同一个对象,。所以代码1的运行结果是Right。

    而对于这个范围之外的数值,valueOf()相会重新new一个对象,所以就不相等了,所以代码2的裕兴结果就是Wrong。

    2.对于代码3,Integer型变量与int型变量进行比较时,实质上是把Integer类型变量拆箱成int类型,然后进行比较,相等则返回true,否则返回false。此处的拆箱调用的是intValue()方法。所以代码3的运行结果是Right。

    3.对于代码4,就比较好解释了,因为new相当于重新定义了一个新的对象,即l1的引用实质是指向在堆中了,而l2实质是指向在常量池中了(关于变量在内存中的位置可参考:http://www.cnblogs.com/wangkundentisy/p/6636340.html),所以两者是不可能相等的,故输出结果就是Wrong。

    4.总之,要想比较两个Intger型变量的值最好用Integer.intValue()方法生成int型后再比较。

    5.Integer型变量与int型变量之间可以直接比较,此时自动进行拆箱操作。

    参考:

      1.https://www.cnblogs.com/liuling/archive/2013/05/05/intAndInteger.html

      2.http://blog.csdn.net/snail_rao/article/details/7639194

      3.《JAVA核心技术》

  • 相关阅读:
    e621. Activating a Keystroke When Any Child Component Has Focus
    e587. Filling Basic Shapes
    e591. Drawing Simple Text
    e595. Drawing an Image
    e586. Drawing Simple Shapes
    e636. Listening to All Key Events Before Delivery to Focused Component
    在 PL/SQL 块的哪部分可以对初始变量赋予新值? (选择1项)
    Oracle数据库中,在SQL语句中连接字符串的方法是哪个?(选择1项)
    你判断下面语句,有什么作用?(单选)
    Oracle数据库表空间与数据文件的关系描述正确的是( )
  • 原文地址:https://www.cnblogs.com/wangkundentisy/p/7819763.html
Copyright © 2011-2022 走看看