Java中int与Integer的区别详解及常见问题解决

 更新时间:2025年07月05日 09:52:56   作者:十六点五  
在Java编程语言中int和Integer虽然都用于表示数值,但它们之间存在着显著的区别,这篇文章主要介绍了Java中int与Integer的区别详解及常见问题的相关资料,需要的朋友可以参考下

1. 本质与存储方式

特性intInteger
类型基本数据类型(Primitive Type)引用类型(包装类,Object 的子类)
存储位置栈内存(Stack)堆内存(Heap)
内存占用4 字节(固定)对象头 + 4 字节值 ≈ 16-24 字节

示例

 int a = 10;                 // 栈中直接存储值 10
 Integer b = Integer.valueOf(10); // 堆中存储对象,变量 b 存储对象引用

2. 默认值

场景intInteger
未初始化值0null
集合存储无法直接存入集合(需自动装箱为 Integer可直接存入集合(如 List<Integer>

示例

 int num1;                    // 默认值为 0
 Integer num2;                // 默认值为 null(可能引发 NullPointerException)
 List<Integer> list = new ArrayList<>();
 list.add(10);               // 自动装箱:int → Integer

3. 功能与方法

能力intInteger
方法支持无方法,仅存储值提供数值转换、比较等工具方法(如 parseInt()compareTo()
空值处理不能为 null可为 null(需注意空指针)
泛型支持无法直接用于泛型支持泛型(如 List<Integer>

示例

 int num = Integer.parseInt("123");     // String → int
 Integer value = Integer.valueOf("456");// String → Integer
 int max = Integer.MAX_VALUE;           // 获取 int 最大值

4. 自动装箱与拆箱

  • 自动装箱(Autoboxing):Java 编译器自动将 int 转换为 Integer

  • 自动拆箱(Unboxing):自动将 Integer 转换为 int

示例

 Integer a = 10;     // 自动装箱:等价于 Integer.valueOf(10)
 int b = a;          // 自动拆箱:等价于 a.intValue()

性能注意: 自动装箱/拆箱会带来额外开销,高频操作时建议直接使用 int

5. 比较操作

比较方式intInteger
== 比较直接比较值是否相等比较对象引用地址(除非值在缓存范围内)
equals()不适用(基本类型无方法)比较值是否相等

示例

 int x1 = 1000;
 int x2 = 1000;
 System.out.println(x1 == x2); // true(值相等)
 ​
 Integer y1 = 1000;
 Integer y2 = 1000;
 System.out.println(y1 == y2); // false(对象地址不同)
 System.out.println(y1.equals(y2)); // true(值相等)
 ​
 // 缓存范围测试(-128~127)
 Integer z1 = 127;
 Integer z2 = 127;
 System.out.println(z1 == z2); // true(复用缓存对象)

6. 缓存机制(IntegerCache)

  • 缓存范围Integer 类默认缓存 -128127 之间的值。

  • 目的:减少频繁创建小数值对象,优化内存和性能。

  • 扩展缓存:可通过 JVM 参数 -XX:AutoBoxCacheMax=<size> 调整上限。

示例

 Integer a = 127;    // 从缓存获取
 Integer b = 127;    // 复用缓存对象
 System.out.println(a == b); // true
 ​
 Integer c = 128;    // 超出缓存范围,新建对象
 Integer d = 128;    // 新建另一个对象
 System.out.println(c == d); // false

7. 使用场景

场景推荐使用原因
高频计算int避免自动装箱开销,性能更优
集合存储Integer集合泛型不支持基本类型(如 List<int> 非法)
数据库映射Integer数据库字段可能为 NULL,int 无法表示
API 设计Integer方法参数或返回值可能需区分“无值”(null)

8. 常见问题与陷阱

(1) NullPointerException

 Integer value = null;
 int num = value; // 运行时抛出 NullPointerException(自动拆箱调用 intValue())

(2) 性能损耗

 // 高频循环中自动装箱导致性能下降
 long sum = 0;
 for (Integer i = 0; i < 100000; i++) { // 每次循环触发装箱
     sum += i;
 }

(3) 比较错误

 Integer a = 200;
 Integer b = 200;
 if (a == b) { // false,应使用 equals() 或 intValue() 比较
     System.out.println("Equal");
 }

总结

维度intInteger
类型基本数据类型包装类(引用类型)
内存栈存储,高效堆存储,有对象开销
空值不支持支持(需防空指针)
方法提供工具方法
适用场景高频计算、性能敏感场景集合、数据库映射、API 设计

选择建议

  • 优先使用 int:在不需要对象特性(如 null 值、方法操作)时,提升性能。

  • 必须使用 Integer:在泛型集合、数据库映射或需要区分“无值”场景时。

到此这篇关于Java中int与Integer的区别详解及常见问题解决的文章就介绍到这了,更多相关Java中int与Integer区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot 整合MyBatis+MyBatis-Plus+MyBatisX插件使用

    SpringBoot 整合MyBatis+MyBatis-Plus+MyBatisX插件使用

    本文主要介绍了SpringBoot 整合MyBatis+MyBatis-Plus+MyBatisX插件使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-04-04
  • 教你用Java验证服务器登录系统

    教你用Java验证服务器登录系统

    这篇文章主要介绍了教你用Java验证服务器登录系统,文中有非常详细的代码示例,对正在学习java的小伙伴们有很好的帮助,需要的朋友可以参考下
    2021-04-04
  • Java计时器StopWatch实现方法代码实例

    Java计时器StopWatch实现方法代码实例

    这篇文章主要介绍了Java计时器StopWatch实现方法代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • SpringBoot基于HttpMessageConverter实现全局日期格式化

    SpringBoot基于HttpMessageConverter实现全局日期格式化

    这篇文章主要介绍了SpringBoot基于HttpMessageConverter实现全局日期格式化,使用Jackson消息转换器,非常具有实用价值,需要的朋友可以参考下
    2018-12-12
  • spring aop之@AfterReturning不生效问题及解决

    spring aop之@AfterReturning不生效问题及解决

    这篇文章主要介绍了spring aop之@AfterReturning不生效问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Spring Boot实现模块化的几种方法

    Spring Boot实现模块化的几种方法

    模块可以是业务模块,为应用程序提供一些业务服务,或者为几个其他模块或整个应用程序提供跨领域关注的技术模块。这篇文章主要介绍了Spring Boot实现模块化,需要的朋友可以参考下
    2018-07-07
  • 基于Java代码实现数字在数组中出现次数超过一半

    基于Java代码实现数字在数组中出现次数超过一半

    这篇文章主要介绍了基于Java代码实现数字在数组中出现次数超过一半的相关资料,需要的朋友可以参考下
    2016-02-02
  • SpringBoot+JavaMailSender实现腾讯企业邮箱配置

    SpringBoot+JavaMailSender实现腾讯企业邮箱配置

    这篇文章主要介绍了SpringBoot+JavaMailSender实现腾讯企业邮箱配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 关于mybatis-plus逻辑删除自动填充更新时间的问题

    关于mybatis-plus逻辑删除自动填充更新时间的问题

    mybatis-plus是对mybatis的增强,mybatis-plus更像是面向对象编程,数据库基本CRUD的操作可以不用手动编写SQL语句,大大提高了开发的效率,这篇文章主要介绍了mybatis-plus逻辑删除自动填充更新时间问题,需要的朋友可以参考下
    2022-07-07
  • 基于mybatis-plus QueryWrapper 排序的坑

    基于mybatis-plus QueryWrapper 排序的坑

    这篇文章主要介绍了mybatis-plus QueryWrapper 排序的坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01

最新评论