推荐将 list.size() 等频繁调用的字段或方法结果提取为局部变量,避免循环中重复开销;不推荐在 for 循环条件中直接调用 list.size()。

直接用局部变量替代频繁访问的字段或方法调用,是Java中最轻量、最有效、最容易落地的性能优化手段之一。
把重复计算的结果存成局部变量
避免在循环条件或循环体内反复调用开销较大的方法。比如 list.size()、map.get(key) 或自定义的 expensiveOperation(),每次调用都涉及栈帧创建、参数压栈、寻址等成本。
- 不推荐:
for (int i = 0; i - 推荐:
int len = list.size();<br>for (int i = 0; i
用局部变量缓存对象引用或常量值
当某个对象(如配置项、工具类实例)或常量(如 static final int TIMEOUT = 5000)在方法内被多次读取时,先赋给局部变量再使用,能减少字段查找和内存寻址次数。
- 尤其适用于:循环体中反复访问
this.field、SomeClass.CONST或obj.getValue() - 注意:不要过度缓存不变值(如字面量
100),JVM 本身会做常量折叠,但对方法调用或字段访问仍有效
让变量作用域最小化,减少堆分配压力
局部变量默认在栈上分配,方法结束即释放;而提前声明在方法顶部的变量,哪怕只在某个分支里使用,也会全程占用栈空间,且可能延长对象生命周期,间接影响GC。
- 错误写法:
String tmp = null;<br>if (condition) { tmp = "abc"; process(tmp); } - 正确写法:
if (condition) { String tmp = "abc"; process(tmp); } - 效果:避免无意义的栈槽占用,也降低逃逸分析失败概率,有助于JIT将对象栈上分配
配合 var 提升可读性,但不牺牲类型明确性
Java 10+ 支持 var 声明局部变量,语法更简洁,且不改变类型安全。合理使用可让代码聚焦逻辑,而非冗余类型声明。
- 适合场景:
var list = new ArrayList<string>();</string>var mapper = objectMapper.readValue(json, MyDto.class); - 避免场景:
类型模糊时(如var result = compute();)、lambda 参数、返回值、字段声明 - 本质仍是静态类型 —— 编译后字节码与显式声明完全一致,零运行时开销
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











