int和Integer有什么区别?
答:Java是一个近乎纯洁的面向对象编程语言,可是为了编程的方便仍是引入了基本数据类型,可是为了可以将这些基本数据类型当成对象操做,Java为每个基本数据类型都引入了对应的包装类型(wrapper class),int的包装类就是Integer,从Java 5开始引入了自动装箱/拆箱机制,使得两者能够相互转换。
Java 为每一个原始类型提供了包装类型:
- 原始类型: boolean,char,byte,short,int,long,float,double
- 包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Doublejava
1面试 2编程 3app 4编程语言 5ide 6ui 7spa 8.net 9code 10 |
|
最近还遇到一个面试题,也是和自动装箱和拆箱有点关系的,代码以下所示:
1 2 3 4 5 6 7 8 9 |
|
若是不明就里很容易认为两个输出要么都是true要么都是false。首先须要注意的是f一、f二、f三、f4四个变量都是Integer对象引用,因此下面的==运算比较的不是值而是引用。装箱的本质是什么呢?当咱们给一个Integer对象赋一个int值的时候,会调用Integer类的静态方法valueOf,若是看看valueOf的源代码就知道发生了什么。
1 2 3 4 5 |
|
IntegerCache是Integer的内部类,其代码以下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
|
简单的说,若是整型字面量的值在-128到127之间,那么不会new新的Integer对象,而是直接引用常量池中的Integer对象,因此上面的面试题中f1==f2的结果是true,而f3==f4的结果是false。
提醒:越是貌似简单的面试题其中的玄机就越多,须要面试者有至关深厚的功力。