int和Integer的区别

Java面试题——int 和Integer的区别

答:int是基本数据类型之一,Integer是int的包装类。

面试官:......然后呢?

答:......


怎么能忘了,在梳理一下。

理解int和Integer的区别,首先需要了解两个概念:

1.Java的常量池

2.Java的自动拆箱和装箱

好了,翠花,上酸菜。

Demo:

        int i = 127;
        Integer i2 = 127;           //自动装箱,Integer i2=Integer.valueOf(127);
        Integer i3 = new Integer(127);

        System.out.println(i == i2);      //ture ,在进行比较时,i2会自动拆箱为int
        System.out.println(i == i3);      //ture ,在进行比较时,i3会自动拆箱为int
        System.out.println(i2 == i3);     //false ,两个对象比较,一个存在于常量池,一个存在于堆中。

        int n = 128;
        Integer n2 = 128;
        Integer n3 = new Integer(128);

        System.out.println(n == n2);      //ture ,同上
        System.out.println(n == n3);      //ture
        System.out.println(n2 == n3);     //false

        Integer o = 127;
        Integer m = 128;
        System.out.println(i2 == o);      //ture ,127存在于常量池中,是同一个值
        System.out.println(n2 == m);      //false ,128不存在常量池中,n2和m代表不同的对象,其值分别存储在堆中不同位置。

其中,Integer. valueOf的源码如下:

    /**
     * Returns a {@code Integer} instance for the specified integer value.
     * <p>
     * If it is not necessary to get a new {@code Integer} instance, it is
     * recommended to use this method instead of the constructor, since it
     * maintains a cache of instances which may result in better performance.
     *
     * @param i
     *            the integer value to store in the instance.
     * @return a {@code Integer} instance containing {@code i}.
     * @since 1.5
     */
    public static Integer valueOf(int i) {
        return  i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128];
    }

    /**
     * A cache of instances used by {@link Integer#valueOf(int)} and auto-boxing
     */
    private static final Integer[] SMALL_VALUES = new Integer[256];

    static {
        for (int i = -128; i < 128; i++) {
            SMALL_VALUES[i + 128] = new Integer(i);
        }
    }

结论:

1.new出来的Integer相比较,均为false,代表两个不同的对象,存储在堆中的位置不一样。

2.非new出来的Integer相比较,如果数在-128到127之间,则是true,否则为false 。

3.int和Integer相比较,均为ture,因为Integer会先自动拆箱为int,再进行比较。

4.Integer和new Integer相比较,均为false。

   如果值在-128到127之间,Integer的值存在于常量池,new Integer的值存在于堆中;

   如果没在-128到127之间,那么均视为new Integer,同结论1。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值