原始长值127和128

我想使用if条件比较两个Long对象值。 当这些值小于128时if条件正常工作,但是当它们大于或等于128时 ,比较失败。

例:

Long num1 = 127;
Long num2 = 127;

if (num1 == num2) {
    // Works ok
}

上面的代码比较正常工作,但在下面的代码中失败:

Long num1 = 128;
Long num2 = 128;

if (num1 == num2) {
    // Does NOT work
}

为什么比较Long变量与大于127的值有问题? 如果变量数据类型更改为长基元 ,则比较适用于所有情况。


为什么在比较Long值大于127的变量时存在问题? 如果上述变量的数据类型是原始的(长),那么代码适用于所有值。

Java缓存Integer对象实例,范围从-128到127 。 这就是说:

  • 如果您将N Long变量的值设置为127 (缓存),则所有引用都会指向同一个对象实例。 (N个变量,1个实例)
  • 如果设置N长变量的值为128 (未缓存),则每个引用都会指向一个对象实例。 (N个变量,N个实例)
  • 这就是为什么这样:

    Long val1 = 127L;
    Long val2 = 127L;
    
    System.out.println(val1 == val2);
    
    Long val3 = 128L;
    Long val4 = 128L;
    
    System.out.println(val3 == val4);
    

    输出这个:

    真正

    对于127L值,由于两个引用(val1和val2)都指向内存中的同一对象实例(缓存),所以它返回true

    另一方面,对于128值,由于没有实例将其缓存在内存中,因此为盒装值的任何新赋值创建一个新实例,从而生成两个不同的实例(由val3和val4指向)并返回false他们之间的比较。

    发生这种情况的唯一原因是您将两个Long 对象引用 (不是long原始值)与==运算符进行比较。 如果不是这种Cache机制,这些比较总是会失败,所以真正的问题是将盒装值与==运算符进行比较。

    将这些变量更改为原始long类型将防止发生这种情况,但如果需要使用Long对象保留代码,则可以使用以下方法安全地进行这些比较:

    System.out.println(val3.equals(val4));                     // true
    System.out.println(val3.longValue() == val4.longValue());  // true
    System.out.println((long)val3 == (long)val4);              // true
    

    国际海事组织 ,在处理对象比较时坚持使用.equals()方法总是一个好主意。

    免责声明:如果这些值中的任何一个为空(即使强制转换为抛出异常),大多数比较都会失败,因此需要额外的检查来适应这些情况。

    参考链接:

  • https://today.java.net/pub/a/today/2005/03/24/autoboxing.html
  • https://blogs.oracle.com/darcy/entry/boxing_and_caches_integer_valueof
  • http://java.dzone.com/articles/surprising-results-autoboxing

  • num1num2是长对象。 你应该使用equals()来比较它们。 ==比较可能有时会因为JVM框元素的方式而起作用,但不依赖于它。

    if (num1.equals(num1))
    {
     //code
    }
    

    Java将原始值从-128缓存到127 。 当我们比较两个Long对象java内部类型时,将它转换为原始值并进行比较。 但是在127以上,Long对象不会获得类型种姓。 Java通过.valueOf()方法缓存输出。

    此缓存适用于从-128到127的Byte,Short,Long。对于Integer缓存可以从-128到java.lang.Integer.IntegerCache.high或127,取其中较大的一个(我们可以设置最高级别的值为整数值应该通过使用java.lang.Integer.IntegerCache.high来缓存)。

     For example:
        If we set java.lang.Integer.IntegerCache.high=500;
        then values from -128 to 500 will get cached and 
    
        Integer a=498;
        Integer b=499;
        System.out.println(a==b)
    
        Output will be "true".
    

    Float和Double对象永远不会被缓存。

    字符将从0到127缓存

    你正在比较两个对象。 所以==运算符将检查对象引用的相等性。 有以下几种方法可以做到这一点。

    1)类型将这两个对象转换为原始值并进行比较

        (long)val3 == (long)val4
    

    2)读取对象的值并进行比较

        val3.longValue() == val4.longValue()
    

    3)在对象比较中使用equals()方法。

        val3.equals(val4);  
    
    链接地址: http://www.djcxy.com/p/10045.html

    上一篇: primitive Long values 127 and 128

    下一篇: PHPDoc type hinting for array of objects?