面试题:int与Integer关系、享元模式、自动拆箱/装箱

前面先直接把面试题 列出来

//        面试题:
        Integer a = 1000;
        Integer b = 1000;
        Integer c = 100;
        Integer d = 100;
        // 在   -128 ~ 127 之外的数
        // 在   -128 ~ 127 之内的数
        boolean e = a == b;
        boolean f = c == d;
        LogUtil.fussenLog().d(e + "------" + f);
结果是:     false       true

下面是解释:(由于比较懒,直接在注释里面把解释内容写上去了)

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

//        0 int 与 Integer的基本使用对比
//        int 是基本类型  直接存数值 进行初始化时int类的变量初始为0
//        Integer是对象 用一个引用只想这个对象 Integer的变量初始化为null

//        init0();

//        1Java两种数据类型分类
//        原始数据类型,分为boolean byte int char long short double float
//        引用数据类型,分为数组,类,接口  如String

//        Java为每个原始类型提供了封装类
//        为了编程的方便还是引入基本数据类型,但是为了能够将这些基本数据类型当作对象操作,Java为
//        每一个基本数据类型都引入了对应的包装类型(wrappper class),int 的包装类是Integer,从
//        Java5 开始引入了自动装箱/拆箱机制,使得二者可以相互转换

//        基本类型    boolean  char       byte short int      long float double
//        封装类类型  Boolean  Character  Byte Short Integer  Long Float Double


//        基本解析
//        自动装箱:将基本数据类型重新转化为对象
//        自动拆箱:将对象重新转化为基本数据类型

//        init1();


//        面试题:
        Integer a = 1000;
        Integer b = 1000;
        Integer c = 100;
        Integer d = 100;
        // 在   -128 ~ 127 之外的数
        // 在   -128 ~ 127 之内的数
        boolean e = a == b;
        boolean f = c == d;
        LogUtil.fussenLog().d(e + "------" + f);
        //   e false  f true

        //原因分析:归结于Java对于 Integer与int的自动装箱与拆箱设计,是一种模式
//        享元模式
//        加大对简单数字的重复利用,Java定义在自动装箱时对于值从-128到127的值,他们被装箱为Integer对象后
//        会存在内存中被重用 始终只存在一个对象
//        而如果超过了从-128 到 127 之间的值 被装箱后的Integer 对象并不会被重用 即相当于每次装箱时都新建一个Integer对象





    }

    private void init1() {
        //这个声明就是用到了 自动装箱
//        解析为: Integer num = new Integer(9);
        Integer num = 9;

//        9是属于基本数据类型的,原则上它是不能直接赋值给一个对象Integer的,但是jdk1.5后你就可以进行这样的声明。
//        自动将基本数据类型转化为对应的封装类型,成为一个对象以后就可以调用对象生命的所有方法。
/*
    ----------------------------------------------------------------------
 */

//      这里用到了自动拆箱
        LogUtil.fussenLog().d(num--);
//        因为对象是不能直接进行运算的,而要转化为基本数据类型后才能进行加减乘除。


        //对比
//        装箱
//        Integer n = 10;
//        拆箱
//        int m = n;

    }

    private void init0() {
        ArrayList a = new ArrayList();
        int n = 40;
        Integer m = new Integer(n);
        //本来是 a.add(n)不可以  a.add(m)可以的 现在估计是ArrayList优化了 填入参数是Object  都可以
        a.add(n);
        a.add(m);
    }
}

下面是Integer源码解析

给一个Integer对象赋一个int值的时候,会调用Integer类的静态方法valueOf,源码如下:

public static Integer valueOf(String s, int radix) throws NumberFormatException {
        return Integer.valueOf(parseInt(s,radix));
    }
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);
    }
IntegerCache是Integer的内部类,源码如下:

 /**
      * 缓存支持自动装箱的对象标识语义
      * -128和127(含)。
      *
      * 缓存在第一次使用时初始化。 缓存的大小
      * 可以由-XX:AutoBoxCacheMax = <size>选项控制。
      * 在VM初始化期间,java.lang.Integer.IntegerCache.high属性
      * 可以设置并保存在私有系统属性中
     */
    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) {
                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);
            }
            high = h;

            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);
        }

        private IntegerCache() {}
    }

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值