将循环中不变的计算提取到循环外是提升性能最直接有效的方法:包括提前获取集合大小、提取与循环变量无关的表达式、缓存数组或集合引用,并注意变量作用域最小化。

把循环里不变的计算挪到外面,是提升 for 循环性能最直接有效的方法之一。核心逻辑很简单:避免重复做同一件事。JVM 不会自动帮你识别哪些表达式在整个循环中结果不变,得靠程序员主动提取。
把循环条件里的方法调用提出来
比如 for (int i = 0; i < list.size(); i++) —— 看似只是读个长度,但对 LinkedList 来说,每次调用 size() 都要遍历整个链表;即使对 ArrayList,JVM 也不一定内联优化。
改成:
int size = list.size();
for (int i = 0; i < size; i++) {
// ...
}这样 size() 只执行一次,后续全是变量访问,开销几乎为零。
把循环体内不变的表达式提前计算
像 a * b、Math.pow(x, 2)、字符串拼接模板这类与循环变量无关的运算,别留在循环里反复算。
错误写法:
for (int i = 0; i < n; i++) {
result += i * a * b; // a*b 每次都重算
}正确写法:
int factor = a * b;
for (int i = 0; i < n; i++) {
result += i * factor;
}实测中,这种优化能让耗时从几十毫秒降到几纳秒级别。
立即学习“Java免费学习笔记(深入)”;
把数组或集合的引用缓存到局部变量
尤其是多维数组或嵌套结构,避免反复取 array[i] 或 map.get(key)。
例如:
for (int i = 0; i < matrix.length; i++) {
int[] row = matrix[i]; // 提前取出当前行
for (int j = 0; j < row.length; j++) {
process(row[j]);
}
}既减少数组边界检查次数,又提升 CPU 缓存命中率。
注意变量作用域和初始化位置
- 循环变量(如
i,j)本身在 for 语句里声明即可,无需额外定义; - 但真正“外提”的应是那些值不随迭代变化的中间结果;
- 提前计算的变量尽量保持最小作用域,比如只在该循环块内有效,避免污染外层命名空间。
不复杂但容易忽略



















