
使用Integer、Double等包装类是为了区分“数据为0”和“数据不存在”**这是数据库和业务逻辑的刚性需求而基本类型int无法表达“空值null”这一状态。下面我为你拆解成三个层面你一看就明白1. 最核心原因数据库的 NULL 值这是决定性因素。你的Model实体类最终是要映射到数据库表的。数据库的INT字段允许存NULL表示“未知”或“没填”。Java 的int是基本数据类型默认值是 0它永远不可能变成null。举个例子年龄字段假设用户注册时没有填写年龄数据库里存的是NULL。如果你用int age去接收MyBatis或Hibernate在映射时会报错或者强行把NULL转成0。这会导致严重的业务错误你分不清这个人是“0岁婴儿”还是“没填年龄”。用Integer age查出来就是null代码里判断if(age null)就能完美处理。2. 业务逻辑区分“未设置”和“默认值”不仅是数据库在JSON传参时也一样。前端传{score: 0}表示用户考了0分。前端不传score字段表示用户没考这门试。如果用int后端根本收不到null只能收到默认0两个场景就混淆了。用Integer没传就是null传了0就是0逻辑清晰。3. 泛型支持集合类必须用包装类Java的集合框架如List、Map不支持基本类型。如果你的Model里有Listint会报错必须写成ListInteger。为了保证代码风格统一所有数字属性都统一用包装类。那有没有用 int 的时候有。当你100%确定这个字段永远不可能为null时用int更省内存、性能更好。比如实体类的自增主键 ID虽然也有用Integer的但如果你确定查出来一定有值可以用int。数学计算类的方法内部局部变量非实体属性用double比Double计算更快。特别提醒进阶避坑Integer做比较时不能用要用Objects.equals()。因为Integer是对象比较的是内存地址-128到127缓存范围外会出错。算数运算Integer参与加减乘除时会自动拆箱为int但如果Integer是null一运算就会抛出NullPointerException所以操作前一定要判空。总结一句话实体类用包装类Integer/Double是“防人之心不可无”为了安全地处理数据库和前端传来的空值基本类型int/double只用在“我敢保证绝对有值”的局部计算中。如果你现在正在设计一个新项目建议无脑全部用包装类这是目前业界最稳妥的规范。等你熟悉了再根据特定字段如物理删除标记、计数器等酌情改用基本类型。