zoukankan      html  css  js  c++  java
  • autoboxing and unboxing

     Why does 128==128 return false but 127==127 return true

     1 public static void autoboxingUnboxing(){
     2         Integer ta = 127;
     3         Integer tb = 127;
     4         Integer tc = 128;
     5         Integer td = 128;
     6         if(ta == tb) System.out.println("ta equals tb");
     7         if(tc == td) System.out.println("tc equals td");
     8         
     9     }
    10 
    11 
    12 Output:
    13 ta equals tb

    When you compile a number literal in Java and assign it to a Integer (capital I) the compile emits:

    Integer b2 =Integer.valueOf(127)

    This line of code is also generated when you use autoboxing.

    valueOf is implemented such that certain numbers are "pooled", and it returns the same instance for values smaller than 128.

    From the java 1.6 source code, line 621:

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

    The value of high can be configured to another value, with the system property.

    -Djava.lang.Integer.IntegerCache.high=999

    If you run your program with that system property, it will output true!

    The obvious conclusion: never rely on two references being identical, always compare them with .equals() method.

    So b2.equals(b3) will print true for all logically equal values of b2,b3.

    private static class IntegerCache {
        private IntegerCache(){}
    
        static final Integer cache[] = new Integer[-(-128) + 127 + 1];
    
        static {
            for(int i = 0; i < cache.length; i++)
                cache[i] = new Integer(i - 128);
        }
    }
    
    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);
    }
    

    As correctly inferred, this caching code was added to support the object identity semantics of autoboxing for values between -128 and 127 (inclusive), as required by the language specification. Since the same object must be returned for integral values in this range, once the autoboxed value for, say, 0 is created, it must be retained until the virtual machine exits. That leaves the issue of whether or not the values in question are created eagerly or lazily and whether or not any container for those values is created eagerly or lazily.

  • 相关阅读:
    FreeRTOS之源码 及 移植详解
    FreeRTOS之Tracealyzer for FreeRTOS(FreeRTOS+Trace) 详解(源码解析+移植)
    FreeRTOS之全配置项详解、裁剪(FreeRTOSConfig.h)
    linux下安装oracle中遇到的一些问题
    RedHat Enterprise Linux 6 配置Xmanager ,实现图形界面连接
    Linux ext2/ext3文件系统详解
    对固态硬盘ssd进行4k对齐
    在CentOs6.5安装jdk
    Android的API版本和名称对应关系
    Java反射机制及Method.invoke详解
  • 原文地址:https://www.cnblogs.com/reynold-lei/p/4367540.html
Copyright © 2011-2022 走看看