Java高频计算优化核心是避免对象开销:循环累加用int/long等基本类型而非包装类,数组优先于泛型集合,方法参数与局部变量坚守原始类型,装箱仅限必要时用valueOf()并注意缓存边界。

高频计算场景下,Java性能优化的核心是让数值运算“不绕路”——避免对象创建、避免引用跳转、避免隐式转换。基本类型直接存值、栈上分配、无GC压力,天然适合这类场景;包装类则因装箱拆箱、对象头开销和缓存不确定性,容易成为瓶颈。
循环与累加必须用基本类型
任何涉及重复数学运算的路径(如for循环计数、数组遍历求和、统计聚合),都应使用int、long、double等原始类型,而非Integer、Long、Double。
-
错误写法:
Integer sum = 0; for (int i = 0; i —— 每次<code>+=触发一次拆箱+装箱,100万次循环可能新增百万级临时对象 -
正确写法:
int sum = 0; for (int i = 0; i —— 全程栈内整数运算,零对象开销 - 若需最终返回包装类结果,只在最后一步显式转换:
return Integer.valueOf(sum);
数组优先于泛型集合存储批量数值
当处理成千上万数值(如订单金额、传感器采样、直方图计数)时,double[]或int[]比ArrayList<double></double>或List<integer></integer>更高效。
-
double[]内存连续、无引用指针、JIT可向量化优化;ArrayList<double></double>每个元素是堆上对象,含12–16字节对象头,内存占用高3–5倍 - 实测10万条数据:用
double[]比ArrayList<double></double>节省约30%内存,GC暂停时间降低50%以上 - 排序、拷贝等操作优先调用原生方法:
Arrays.sort(primitiveArray)比Collections.sort(wrapperList)更轻量
方法签名与局部变量守住原始类型边界
把包装类挡在性能敏感路径之外——参数、返回值、中间变量,只要不需null语义或泛型支持,就用基本类型。
立即学习“Java免费学习笔记(深入)”;
- 方法入参用
int count, double price,不用Integer count, Double price:避免调用方传入null引发NPE,也省去每次入参拆箱 - 局部计算变量一律声明为基本类型:
long startTime = System.nanoTime();而非Long startTime - 警惕“隐式逃逸”:日志埋点、监控指标等场景,避免把
int临时包装进集合再传入(如Collections.singleton(count)),直接用占位符格式化更安全
规避装箱陷阱与缓存误判
即使必须用包装类,也要控制装箱时机和范围,防止无意中触发对象创建。
- 手动装箱统一用
valueOf():Integer.valueOf(100)复用缓存;禁用new Integer(100)(已废弃) - 注意缓存边界:
Integer.valueOf(127) == Integer.valueOf(127)为true,但Integer.valueOf(128) == Integer.valueOf(128)为false;高频比较务必用equals()或先转基本类型再比 - 拆箱前必判空:
if (score != null) { total += score.intValue(); },否则int s = score;直接抛NullPointerException



















