网站首页 > 技术文章 正文
在 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# 提效实用干货
- 最近发表
- 标签列表
-
- cmd/c (64)
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- sqlset (64)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)