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区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决Mybatis中mapper的ID冲突问题

    解决Mybatis中mapper的ID冲突问题

    这篇文章主要介绍了解决Mybatis中mapper的ID冲突问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Spring Cloud Gateway集成Sentinel流控详情

    Spring Cloud Gateway集成Sentinel流控详情

    这篇文章主要介绍了Spring Cloud Gateway集成Sentinel流控详情,Sentinel支持对Spring Cloud Gateway、Zuul等主流的API Gateway进行限流,需要的朋友可以参考一下
    2022-09-09
  • SpringBoot 3.x使用starter整合Druid的过程及问题小结

    SpringBoot 3.x使用starter整合Druid的过程及问题小结

    Druid是一个由阿里巴巴开源的数据库连接池,性能优越且功能丰富,在Spring Boot项目中集成Druid时,需要注意依赖版本和配置文件的正确性,本文给大家介绍SpringBoot 3.x使用starter整合Druid的过程及问题小结,感兴趣的朋友跟随小编一起看看吧
    2025-11-11
  • java Random.nextInt()方法的具体使用

    java Random.nextInt()方法的具体使用

    这篇文章主要介绍了java Random.nextInt()方法的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 详解Java的readBytes是怎么实现的

    详解Java的readBytes是怎么实现的

    众所周知,Java是一门跨平台语言,针对不同的操作系统有不同的实现,下面小编就来从一个非常简单的api调用带大家来看看Java具体是怎么做的吧
    2023-07-07
  • RabbitMQ在Spring Boot中的使用步骤

    RabbitMQ在Spring Boot中的使用步骤

    在Spring Boot中使用RabbitMQ涉及多个步骤,包括配置、创建监听器和发送消息,下面给大家分享RabbitMQ在Spring Boot中的使用步骤,感兴趣的朋友一起看看吧
    2024-07-07
  • linux中java获取路径的实例代码

    linux中java获取路径的实例代码

    在本篇文章里小编给大家整理的是一篇关于linux中java获取路径的实例代码以及相关知识点,有兴趣的朋友们可以学习参考下。
    2020-02-02
  • JavaBean和SpringBean的区别及创建SpringBean方式

    JavaBean和SpringBean的区别及创建SpringBean方式

    这篇文章主要介绍了JavaBean和SpringBean的区别及创建SpringBean方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java启动Tomcat的实现步骤

    Java启动Tomcat的实现步骤

    本文主要介绍了Java启动Tomcat的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • java启动jar包设置启动参数的实现

    java启动jar包设置启动参数的实现

    本文主要介绍了java启动jar包设置启动参数的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06

最新评论