zoukankan      html  css  js  c++  java
  • JAVA int自动装箱

    int 转 Integer:

    Integer int127_1 = 127;
    Integer int127_2 = 127;
    System.out.println("int127_1 == int127_2 : " + (int127_1 == int127_2));
    
    Integer int128_1 = 128;
    Integer int128_2 = 128;
    System.out.println("int1000_1 == int1000_2 : " + (int128_1 == int128_2));

    运行结果为:

    int127_1 == int127_2 : true
    int1000_1 == int1000_2 : false

    通过反编译的方法,我们发现int在进行自动装箱的时候,调用了Integer.valueOf方法:

    Code:
    0: bipush 127
    2: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
    5: astore_1
    6: bipush 127
    8: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
    11: astore_2
    12: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
    15: new #4 // class java/lang/StringBuilder
    18: dup
    19: invokespecial #5 // Method java/lang/StringBuilder."<init>":()V
    22: ldc #6 // String int127_1 == int127_2 :
    24: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/

    而我们查看Integer.valueOf()方法:

        public static Integer valueOf(int i) {
            if (i >= IntegerCache.low && i <= IntegerCache.high)
                return IntegerCache.cache[i + (-IntegerCache.low)];
            return new Integer(i);
        }
    
        private static class IntegerCache {
            static final int low = -128;
            static final int high;
            static final Integer cache[];
    
            static {
                // high value may be configured by property
                int h = 127;
                String integerCacheHighPropValue =
                    sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
                if (integerCacheHighPropValue != null) {
                    try {
                        int i = parseInt(integerCacheHighPropValue);
                        i = Math.max(i, 127);
                        // Maximum array size is Integer.MAX_VALUE
                        h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                    } catch( NumberFormatException nfe) {
                        // If the property cannot be parsed into an int, ignore it.
                    }
                }
                high = h;
    
                cache = new Integer[(high - low) + 1];
                int j = low;
                for(int k = 0; k < cache.length; k++)
                    cache[k] = new Integer(j++);
    
                // range [-128, 127] must be interned (JLS7 5.1.7)
                assert IntegerCache.high >= 127;
            }
    
            private IntegerCache() {}
        }
    

    Integer.valueOf()方法,默认当int的值在-128~127之间时,会采用缓存的方式提高性能,返回的是一个数组中的值
  • 相关阅读:
    java io 学习笔记(一)
    Centos中查看系统信息的常用命令
    arcgis影像批量裁剪代码
    VS2010中VC++目录和C/C++之间的区别。VC++ Directories和C/C++的区别。
    VS中为什么不同的项目类型属性查看和设置的界面不一样
    C++函数中返回引用和返回值的区别
    java中HashMap的keySet()和values()
    repoquery详解——linux查看包依赖关系的神器
    linux学习笔记
    log4j的AppenderLayout格式符
  • 原文地址:https://www.cnblogs.com/langren1992/p/9757145.html
Copyright © 2011-2022 走看看