Java所有参数均为值传递:基本类型传值拷贝,包装类型传地址值拷贝;因Integer等不可变,操作会生成新对象;比较应使用Objects.equals(),拆箱前需判空;优先用基本类型,必要时用Optional表达可空语义。

基本类型传参是值拷贝,包装类型传参是引用拷贝——但这个“引用”指向的是不可变对象,实际行为常被误读。关键不在“怎么传”,而在“怎么用才不出错”。
传参本质:值传递 vs 引用传递的误区
Java 中所有参数都是值传递。区别在于:
- 基本类型(如 int):栈上值被完整复制一份,方法内修改不影响原变量
- 包装类型(如 Integer):栈上存储的是堆中对象的地址,这个地址值被复制;但因为 Integer 是不可变类,任何算术操作(如
i = i + 1)都会触发拆箱→计算→装箱,生成新对象,原引用不变
常见陷阱:用 == 比较参数值
在方法内部对两个包装类型参数用 == 判断是否“相等”,极易出错:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
Integer a = 100, b = 100;→a == b为 true(缓存范围内,指向同一对象) -
Integer c = 200, d = 200;→c == d为 false(超出缓存,各自新建对象) - 正确做法:统一用
Objects.equals(a, b),它会先判空再调用equals()
空值风险:拆箱时 NPE 高发区
包装类型参数可能为 null,而基本类型不可能。若方法内直接拆箱,运行时崩溃:
立即学习“Java免费学习笔记(深入)”;
- 错误写法:
int value = param; // param 为 null 时抛 NullPointerException - 安全写法:
int value = param != null ? param : 0;或使用param == null ? 0 : param.intValue() - 更推荐:方法签名优先用基本类型;若必须接收 null,提前校验并给出明确默认或异常提示
性能与语义:选哪个更合适?
不是“能不能传”,而是“该不该用包装类型传参”:
- 用基本类型:数值计算、循环控制、性能敏感场景(避免隐式装箱开销)
- 用包装类型:需要表达“缺失值”含义(如数据库字段允许 NULL)、参与泛型方法、或作为可选参数(配合重载或 Optional)
- 进阶建议:对可空数值参数,考虑用
Optional<integer></integer>显式表达意图,比裸Integer更具契约性

















