千家信息网

java中int和Integer的区别有哪些

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,小编给大家分享一下java中int和Integer的区别有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!最近面试了很多
千家信息网最后更新 2026年11月03日java中int和Integer的区别有哪些

小编给大家分享一下java中int和Integer的区别有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

最近面试了很多候选人,发现很多人都不太重视基础,甚至连工作十几年,项目经验十几页的老程序员,框架学了一大堆,但是很多 Java 相关的基础知识却很多都答不上来。还有很多人会回答,只知道要用,但是从来不会去看看它具体是怎么实现的。

我们都知道作为合格的程序员,基本功不扎实会导致你的程序出现许多你难以诊断的诡异问题,例如产生过大开销(频繁GC导致程序卡顿或者产生OOM),Integer 缓存机制产生的诡异现场(下面会详细说),所以就有想写一个关于面试相关系列的文章,把常见又容易采坑的面试问题总结一下,今天想站在面试官的角度去和大家聊聊一些面试的基础题目,以及尽可能指导大家如何给出一个能让面试官满意的答复

基本回答

int 是 8 个基本数据类型(boolean, byte, short, char, int, float, double, long)之一的整形类型,大小占用4字节,取值范围是正负 2 的 32(4 * 8)次幂,Java 虽然号称一切都是对象,但是基本数据类型是例外

Integr 是 int 的包装类,是 JDK 1.5 中引入,提供了字符串转换,数学运算,泛型,自动拆箱装箱等实用功能,极大简化了相关的编程难度

聊聊 Intger 的值缓存范围

下面给出一个典型例子,也是很多人踩过的坑,程序如下(建议自己在机器上实践操作下)

Integer a1 = 127,  b1 = 127;Integer a2 = 128,  b2 = 128;System.out.println(a1 == b1);       // trueSystem.out.println(a2 == b2);       // false
包装类缓存机制的原因

可以思考下为什么会出现以上这种诡异的情况,然后我们下面可以看看 Integer.valueOf 的源码

// Integer.valueOf 的源码public static Integer valueOf(int i) {    if (i >= IntegerCache.low && i <= IntegerCache.high)            return IntegerCache.cache[i + (-IntegerCache.low)];    return new Integer(i);}private static class IntegerCache {        static final int low = -128;        static final int high;    static final Integer cache[];    static {    int h = 127;    ...    high = h;    }}

源码之内无秘密,我们可以看出来出现以上问题的原因是原由 JDK 对 Integer 构造的改进引入缓存机制导致的,传统构造 Integer 的方式是直接调用构造器 new 一个对象,但是在考察和调研后发现大多数人使用 Integer 都集中在较小的范围,因此 JDK 为 Integer.valueOf 增强了一个缓存机制来改善构造对象的性能开销(没错,自动拆箱装箱反编译后也是调用 valueOf() 方法实现构造对象)Java 官方文档给出 Integer 缓存范围是 -128 ~ 127

这里面细节很多,我们就不一一讲述,到这里我们已经可以得出结果了,就是

  1. a1 == b1 对象的引用都是从缓存中取出,实际上是相同对象,所以结果的 true

  2. a2 == b2 是因为128已经超过了缓存值的范围,Integer 通过 new 构造的对象,因为 == 比较的对象的引用而不是对象的值,所以结果自然就为 false

通过以上案例可以我们可以举一反三,不仅仅 Integer 有缓存机制,整个包装类都有缓存机制:

  • Boolean 缓存了 true/false 实例,也就是说 Boolean 只会有 Boolean.TRUE/FALSE 两个常量实例

  • Short 缓存范围是 -128 到 127 之间

  • Byte 范围有限,全部数值都被缓存

  • 等等……

如果继续深挖缓存,例如明确会频繁使用更大范围的 Integer 值得时候,我们可以使用 JVM 提供的参数

-XX:AutoBoxCacheMax=N
Integer 用起来有什么注意事项吗?
  1. 应当避免无意的使用拆装箱 自动拆/装箱实际上是 Java 一种编译期的优化(技巧),算是一种语法糖,只是 Java 在编译期帮你自动转化,最终生成的字节码还是和你自己转换是一样的,无意的创建十万个对象对于程序的内存开销和处理速度来说是巨大的代价

  2. 包装类应避免使用 == 运算符进行值比较

  3. 注意缓存机制的范围

总结

以上我只大概列出的典型回答,其实对于大多数面试能回答以上内容就已经算可以及格了,有的公司面试官以喜欢追问出名,直到候选人回答说不知道,才会打住,这道看似简单的题目,其实可以深挖的点还有很多,进一步考察你的基本功是否扎实,例如:

  1. 线程安全的 Integer (考察你对 java.util.concurrent 并发包的理解)

  2. 基本数据类型和引用类型的局限(考察你对 Java 泛型的理解)

  3. 对象在内存中的结构(对象头 Header,实例数据 Instance Data,对齐填充 Padding)

以上是"java中int和Integer的区别有哪些"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

缓存 对象 范围 机制 程序 类型 数据 包装 诡异 内容 基础 实例 源码 篇文章 结果 问题 编译 装箱 频繁 候选人 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 耶加雪菲 北京路客互联网科技有限公司 科技互联网企业 互联网科技有限公司图片 互联网科技ppt模板 亿账通互联网科技 互联网高科技股票 大白互联网科技 科技赋能互联网健康 港股科技和互联网 乌鲁木齐新华智原互联网科技学校 广州新华互联网科技学校电竞方面 威龙国际互联网科技公司 互联网科技融合创新 南京一网一红互联网科技有限公司 上海同邻互联网科技有限公司规模 昆明中奇联合互联网科技 中国互联网公司的科技投入 互联网对科技影响 株洲百竞科技的互联网营销顾问 互联网科技 互联网科技公司简介 互联网科技的英文 常德市电业局互联网科技部 花神(南京)互联网科技有限公司 广州新华互联网科技学校电竞方面 黑科技 体验场景 互联网大会 梅州GM互联网络科技有限公司 宇信科技在杭州互联网排第几 互联网时代科技型公司的机会
0