当前位置:

【面试必备】你真的知道Integer和int的区别吗?

机器助手 |  2025-07-13
 101人浏览

发现做项目的过程中,在数值类型的比较上容易犯错,特别是Integer和Integer的比较,Integer和int的比较。虽然这些都是些基础语法,但稍不留意就容易犯错,在实际开发过程中如果出现这类失误,很容易失之毫厘谬以千里。在这里,总结下这些基础知识点。

java虽然宣称一切都是对象,但原始数据类型是例外。int是整形数字,是java的8个原始数据类型(Primitive Types)(char、boolean、byte、short、int、long、float、double)之一。在java API中有对应的包装类,分别是Character、Boolean、Byte、Short、Integer、Long、Float、Double。

Integer是int对应的包装类,它有一个int类型的字段存储数据,并且提供了基本操作,比如数学运算、int和字符串之间转换等。在java 5中引入了自动装箱和自动拆箱功能(boxing/unboxing),java可以根据上下文,自动进行转换,极大地简化了相关编程。javac自动把装箱转换为Integer.valueOf(),把拆箱替换为Integer.intValue()。

自动装箱实际上算是一种语法糖。什么是语法糖?可以简单理解为java平台为我们自动进行了一些转换,保证不同的写法在运行时等价,他们发生在编译阶段,也就是生产的字节码是一致的。(此句摘自极客时间专栏)

原始数据类型的变量,需要使用并发相关手段才能保证线程安全。如果有线程安全的计算需要,建议考虑使用类似AtomicInteger、AtomicLong这样的线程安全类。

原始数据类型和java泛型并不能配合使用。因为java的泛型某种程度上可以算作伪泛型,它完全是一种编译期的技巧,java编译期会自动将类型转换为对应的特定类型。这就决定了使用泛型,必须保证相应类型可以转换为Object。

废话不多说,直接来demo,这样效果更直接。

ccc66e6d622a483794eb9e789bbb30e6

需要明确的一点是,包装型(Integer)和基本型(int)比较会自动拆箱(jdk1.5以上)。

在这里很多人比较容易迷惑的是如下情况:


 

Integer a1 = 6; Integer a2 = 6; System.out.println(a1 == a2); //true Integer a3 = 128; Integer a4 = 128; System.out.println(a3 == a4); //false

如果研究过jdk源码,你就会发现Integer a3 = 128;在java编译时会被翻译成 Integer a3 = Integer.valueOf(128); 我们再来看看valueOf()的源码就更清晰了。

e68c4fff0a594d8eb6e82ad6dee48e7f

由以上源码就会发现,对于-128到127之间的数,会进行缓存,Integer a1 = 6时,会将6进行缓存,下次再写Integer a2 = 6;时,就会直接从缓存中取,也就不用new一个对象了,所以a1和a2比较时就为true。但a3和a4是超过范围,会new一个对象,==是进行地址和值比较,是比较两个对象在JVM中的地址,这时a3和a4虽然值相同但地址是不一样的,所以比较就为false了。

通过上面的分析可知:

  • 两个都不是new出来的Integer,且数值在-128~127之间,用==比较时,基本值相等时为true,否则为false
  • 两个都是new出来的Integer,为false
  • int和Integer比较,数值相同,用==比较时为true。(因为Integer会自动拆箱为int去比较)

为了节省内容,对与下列包装对象的两个实例,当他们的基本值相同时,用==判断会为true:


 

Boolean Byte Character, \u0000 - \u007f(7f是十进制的127) Integer, -128 — 127

我们也可以看看其它包装型的缓存情况:


 

Boolean:(全部缓存) Byte:(全部缓存) Character(缓存范围'\u0000'到'\u007F') Short(-128 到 127缓存) Long(-128 到 127缓存) Float(没有缓存) Doulbe(没有缓存)

如果要比较两个Integer对象的值(均为new的对象),可以通过.intValue()进行转换后来比较,如下

78aa762268e64f8cbb98eebe35840549

也可以使用equal()来进行比较,如下:


 

Integer a3 = 128; Integer a4 = 128; System.out.println(a3.equals(a4)); //true

文章评论