网站首页 > 技术文章 正文
在 Java 中,int 和 Integer 是两种不同的数据类型,核心区别如下:
基本类型 vs. 包装类
特性 | int | Integer |
类型 | 基本数据类型(Primitive Type) | 包装类(Wrapper Class) |
存储位置 | 栈内存(直接存储数值) | 堆内存(存储对象引用,对象包含数值) |
默认值 | 0 | null |
内存占用 | 4 字节 | 约 16 字节(对象头 + 成员变量 + 对齐填充) |
使用场景
场景 | int | Integer |
泛型与集合 | 不能直接使用(需装箱为 Integer) | 可直接用于集合(如 List) |
数据库映射 | 无法表示 NULL(可能引发歧义) | 可表示 NULL(与数据库字段对应更准确) |
方法参数与返回值 | 传递值(无法为 null) | 传递对象引用(可为 null) |
自动装箱与拆箱
Java 5+ 引入自动装箱(Autoboxing)和拆箱(Unboxing)机制:
装箱:int → Integer(隐式调用 Integer.valueOf())
Integer a = 10; // 等价于 Integer.valueOf(10)
拆箱:Integer → int(隐式调用 Integer.intValue())
int b = a; // 等价于 a.intValue()
比较操作
- int 的比较:直接比较数值
int x = 1000, y = 1000;
System.out.println(x == y); // true(值相等)
- Integer 的比较:需注意缓存机制(-128 到 127 有缓存)
Integer a = 127, b = 127;
System.out.println(a == b); // true(缓存范围内,引用相同)
Integer c = 128, d = 128;
System.out.println(c == d); // false(超出缓存范围,引用不同)
- 建议:用 equals() 或 intValue() 比较值:
c.equals(d); // true(比较值)
c.intValue() == d; // true(拆箱后比较)
性能差异
- int:性能更高(无需对象创建和垃圾回收)
- Integer:性能较低(对象创建和拆装箱可能带来开销)
总结
选择依据 | 优先用 int | 优先用 Integer |
是否需要 null | 不需要(如计算、临时变量) | 需要(如数据库字段、API 返回值可为空) |
是否涉及泛型/集合 | 不支持 | 必须使用 |
性能敏感场景 | 高性能计算、大规模数据存储 | 非性能关键路径(如业务逻辑层) |
代码示例
// int 的默认值
int primitiveInt; // 默认值为 0
// Integer 的默认值
Integer wrapperInt; // 默认值为 null
// 装箱与拆箱
Integer num1 = 100; // 自动装箱
int num2 = num1; // 自动拆箱
// 缓存范围测试
Integer a = 100, b = 100;
System.out.println(a == b); // true(缓存内)
Integer c = 200, d = 200;
System.out.println(c == d); // false(缓存外)
猜你喜欢
- 2025-05-27 Python进阶 - day1:深入理解数据结构
- 2025-05-27 Java中transient字段的作用
- 2025-05-27 深度学习数据集处理常用函数示例(Python)
- 2025-05-27 Go语言-指针
- 2025-05-27 什么是 happens-before 规则?
- 2025-05-27 「Java」一张图教会你关于null的几种处理方式(内附代码)
- 2025-05-27 Python 中常用的数据结构,帮助你从基础到精通
- 2025-05-27 1、数值类型
- 2025-05-27 基础函数20例,案例解读,再不掌握就真的Out了
- 2025-05-27 12 个 C# 提效实用干货
- 08-06中等生如何学好初二数学函数篇
- 08-06C#构造函数
- 08-06初中数学:一次函数学习要点和方法
- 08-06仓颉编程语言基础-数据类型—结构类型
- 08-06C++实现委托机制
- 08-06初中VS高中三角函数:从"固定镜头"到"360°全景",数学视野升级
- 08-06一文讲透PLC中Static和Temp变量的区别
- 08-06类三剑客:一招修改所有对象!类方法与静态方法的核心区别!
- 1524℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 662℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 528℃MySQL service启动脚本浅析(r12笔记第59天)
- 494℃启用MySQL查询缓存(mysql8.0查询缓存)
- 493℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 481℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 463℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 461℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- windowsscripthost (69)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (70)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)