关闭

由Integer封装与拆箱引申出的java面试题

标签: java面试题
332人阅读 评论(0) 收藏 举报
分类:
  1. Integer自动封装的陷阱
public class IntegerTest {

public static void main(String[] args) {

    Integer a=1000,b=1000; 
    Integer c=100,d=100; 

    System.out.println(a==b);//false
    System.out.println(c==d);//true
  }

}

我们知道==运用于对象时,比较的是双方是否拥有同一个对象,而非简单的比较双方是否拥有相同的值,这里的abcd都是新建出来的对象,按理说都应该输入false才对。
但是道理其实很简单,我们去看下Integer这个类的源码就明白了其中的奥秘:

    /**
     * Returns an {@code Integer} instance representing the specified
     * {@code int} value.  If a new {@code Integer} instance is not
     * required, this method should generally be used in preference to
     * the constructor {@link #Integer(int)}, as this method is likely
     * to yield significantly better space and time performance by
     * caching frequently requested values.
     *
     * This method will always cache values in the range -128 to 127,
     * inclusive, and may cache other values outside of this range.
     *
     * @param  i an {@code int} value.
     * @return an {@code Integer} instance representing {@code i}.
     * @since  1.5
     */
    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
当我们声明一个Integer c = 100;的时候。此时会进行自动装箱操作,简单点说,也就是把基本数据类型转换成Integer对象,而转换成Integer对象正是调用的valueOf方法,可以看到,Integer中把-128至127 缓存了下来。官方解释是小的数字使用的频率比较高,所以为了优化性能,把这之间的数缓存了下来。这就是为什么这道题的答案回事false和ture了。当声明的Integer对象的值在-128-127之间的时候,引用的是同一个对象,所以结果是true。

2. Integer自动拆箱机制
下面在看看这个例子:

public class IntegerTest {

public static void main(String[] args) {

    Integer a = new Integer(1000);
    int b = 1000;
    Integer c = new Integer(10);
    Integer d = new Integer(10);

    System.out.println(a == b);//true
    System.out.println(c == d);//false

  }
}

看到这个答案很多小伙伴又会不解,先来说下第二个,Integer不是把-128至127缓存起来了吗?这不是应该是true嘛,但是你仔细看,这里的Integer是我们自己new出来的,并不是用的缓存,所以结果是false。 现在来看第一个为啥又是true了呢? 首先这里的值为1000,肯定和我们所知的Integer缓存没有关系。既然和缓存没有关系,a是新new出来的对象,按理说输入应该是false才对。但是注意b这里是int类型。当int和Integer进行==比较的时候,Java会把Integer进行自动拆箱,也就是把Integer转成int类型,所以这里进行比较的是int类型的值,所以结果即为true。

0
0
查看评论

Java中拆箱封箱,以及需要注意的陷阱

一、什么是自动装箱拆箱  很简单,下面两句代码就可以看到装箱和拆箱过程 //自动装箱 Integer total = 99; //自定拆箱 int totalprim = total;1234512345 简单一点说,装箱就是自动将基本数据类型转换为包装器类型;拆箱就是自动将包装器...
  • shukebai
  • shukebai
  • 2017-05-22 16:29
  • 892

Java学习笔记之自动装箱与拆箱

更多博文可参考我的个人独立博客:贱贱的梦想 什么是自动装箱与拆箱自动装箱就是Java自动将原始类型值转换成对应的对象,比如将int的变量转换成Integer对象,这个过程叫做装箱,反之将Integer对象转换成int类型值,这个过程叫做拆箱。 自动装箱时编译器调用valueOf()将原始类型值转...
  • GongchuangSu
  • GongchuangSu
  • 2016-05-28 22:28
  • 1183

Java中Integer与int类型的装箱和拆箱

其实Integer与int类型的赋值与比较最关键的一点就是:这两个变量的类型不同。Integer是引用类型,int是原生数据类型。         我们分四种情况来讨论:         1) Integer与int...
  • snail_rao
  • snail_rao
  • 2012-06-06 17:38
  • 12098

int与Integer,long与Long的区别以及装箱与拆箱的理解

1,从数据类型看:int和long是基本数据类型,对其赋值属于数值引用,只能对其进行数值运算 Integer和Long是对象类型,既然是对象那就有属性,有方法,这都是基本数据类型不包含的. 2,在实际使用中,对二者要注意的便是,int和long的默认值是0,使用时不用对其做null判断,也就不会...
  • csdnliuxin123524
  • csdnliuxin123524
  • 2017-07-27 15:02
  • 480

Java中Integer与int类型的比较--装箱和拆箱

先上例子:下面的代码输出什么? Integer a = 1; Integer b = 1; Integer c = 2; Integer d = 3; Integer e = new Inte...
  • Kinger0
  • Kinger0
  • 2015-08-24 11:01
  • 5024

Integer包装类包箱拆箱小秘密?

问题1: Integer i1 = 127; Integer i2 = 127; System.out.println(i1 == i2); //true 分析: After compiling,This statement(Integer i1 = 127; ) is turned into I...
  • u012557814
  • u012557814
  • 2016-03-04 10:50
  • 730

Java进阶之自动拆箱与自动装箱

自动装箱:把基本类型用它们对应的包装类包装起来,使它们具有对象的特质,可以调用所对应的包装类所定义的方法,比如toString()等。 自动拆箱:跟自动装箱的方向相反,将Integer及Double这样的包装类的对象重新简化为基本类型的数据。
  • qq_31655965
  • qq_31655965
  • 2016-06-06 18:04
  • 1718

java的封箱和拆箱

转载自http://www.cnblogs.com/dolphin0520/p/3780005.html
  • ni357103403
  • ni357103403
  • 2015-07-29 17:16
  • 1945

JAVA包装类及其拆箱装箱及Integer类拆装箱的细节

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ---------------------- 在JAVA中,数据类型可分为两大种,基本数据类型(值类型)和类类型(引用数据类型)。基本类型的数据不是对象,所以对于要将基本数据类型当对象使...
  • u011559849
  • u011559849
  • 2014-03-20 02:17
  • 1417

Integer的自动拆箱和自动装箱的陷阱(整型数-128到127的值比较问题)

原文地址:http://blog.csdn.net/ma451152002/article/details/9076793 Integer的自动拆装箱的陷阱(整型数-128到127的值比较问题): 1、先看下面的例子: [java] view plain...
  • tanga842428
  • tanga842428
  • 2016-10-11 17:08
  • 1190
    个人资料
    • 访问:175600次
    • 积分:1665
    • 等级:
    • 排名:千里之外
    • 原创:17篇
    • 转载:26篇
    • 译文:0篇
    • 评论:11条
    最新评论