• JAVA 基础之Integer


    jdk1.5后增加了自动拆箱和自动装箱特性。java的八种 byte,short,int,long,float,double,char,boolean基本类型和各自对应的包装类型的相互转化。

    装箱指的是 int类型 变为 Integer实例对象,拆箱指的是 Integer实例 变为 int类型。

    java.lang包下的类Integer。作为int基本类型的封装类。有以下特点。

    一、

    Integer a = 100;

    Integer b = 100;

    Integer c = 1000;

    Integer d = 1000;

    System.out.println(a == b);

    System.out.println(c==d)

    输出结果是:true false

    分析:

    (1)Integer a = 100;会自动掉用Integer的 valueOf(int i)方法进行自动装箱。当值i >=-128 && i < 127 时会调用已经初始化好的缓存中的Integer实例。

    所以 System.out.println(a == b)a、b指向相同Integer对象的实例

    (2)Integer b = 1000, 虽然也会掉用Integer中valueOf(int i)方法进行自动装箱。但是值得范围不在缓存中。所以c 、d返回的是不同Integer对象的实例。

    所以 System.out.println(c == d) 输出的结果为false

    备注:jdk之所以这么设计是因为小数字[-128,127)访问频率比较高,放在缓存中提高Integer类的性能和效率。

    Jdk中Integer类的源码如下:

     1  /**
     2      * Returns a <tt>Integer</tt> instance representing the specified
     3      * <tt>int</tt> value.
     4      * If a new <tt>Integer</tt> instance is not required, this method
     5      * should generally be used in preference to the constructor
     6      * {@link #Integer(int)}, as this method is likely to yield
     7      * significantly better space and time performance by caching
     8      * frequently requested values.
     9      *
    10      * @param  i an <code>int</code> value.
    11      * @return a <tt>Integer</tt> instance representing <tt>i</tt>.
    12      * @since  1.5
    13      */
    14     public static Integer valueOf(int i) {
    15         if(i >= -128 && i <= IntegerCache.high)
    16             return IntegerCache.cache[i + 128];
    17         else
    18             return new Integer(i);
    19     }
     1  private static class IntegerCache {
     2         static final int high;
     3         static final Integer cache[];
     4 
     5         static {
     6             final int low = -128;
     7 
     8             // high value may be configured by property
     9             int h = 127;
    10             if (integerCacheHighPropValue != null) {
    11                 // Use Long.decode here to avoid invoking methods that
    12                 // require Integer's autoboxing cache to be initialized
    13                 int i = Long.decode(integerCacheHighPropValue).intValue();
    14                 i = Math.max(i, 127);
    15                 // Maximum array size is Integer.MAX_VALUE
    16                 h = Math.min(i, Integer.MAX_VALUE - -low);
    17             }
    18             high = h;
    19 
    20             cache = new Integer[(high - low) + 1];
    21             int j = low;
    22             for(int k = 0; k < cache.length; k++)
    23                 cache[k] = new Integer(j++);
    24         }
    25 
    26         private IntegerCache() {}
    27     }

     读了源码可以发现点,缓存数组的范围大小low是确定的-128,但是high可以通过jvm参数自行配置。

    二、

         Integer a = new Integer(1000);

         Int b = 1000;

         System.out.println(a == b);

         输出结果为true

    分析:

          当a 与 b进行 == 比较时,会将a自动拆箱为基本类型1000,所以结果为true;

  • 相关阅读:
    word 快捷键
    java中的各种修饰符作用范围
    pinyin4j的基本使用
    022-pinyin4j工具类模板
    测开之路一百四十五:SQLAlchemy与后台模板整合之新增、查询、删除
    测开之路一百四十四:ORM之SQLAlchemy查询
    测开之路一百四十三:ORM框架之SQLAlchemy模型及表创建
    测开之路一百四十二:ORM框架之SQLAlchemy建库、建表、数据库操作
    测开之路一百四十一:蓝图实现程序模块化
    测开之路一百四十:可拔插视图(基于类、基于方法)
  • 原文地址:https://www.cnblogs.com/mxmbk/p/5072055.html
Copyright © 2020-2023  润新知