开始使用免费开始使用

优化财务分析应用

作为一名为财务分析应用开发的 Java 工程师,您发现某个报表生成方法会产生过多的垃圾对象,进而频繁触发垃圾回收。该报表会将成千上万的数据点拼接成一个字符串。您需要重构这段代码,使其更友好于 GC,同时保持功能不变。

本练习是课程的一部分

Java 代码优化

查看课程

练习说明

  • 创建一个具有合适初始长度的 StringBuilder 实例。
  • 对于 dataPoints 中的每个值,将其格式化后追加到 string builder 中。
  • StringBuilder 转换为 String 并返回。

交互式实操练习

通过完成这段示例代码来试试这个练习。

public class Main {
    public static String generateReportWithoutOptimization(double[] dataPoints) {
        String report = "";
        for (double value : dataPoints) {
            report += String.format("%.2f, ", value);
        }
        return report;
    }
    
    public static String generateReportWithOptimization(double[] dataPoints) {
        // Create a new string builder
        StringBuilder report = new  ____(dataPoints.length * 8);
        for (double value : dataPoints) {
            // For every value, add the formatted value to the string builder 
            report.____(String.format("%.2f, ", value));
        }
        // Convert to string before returning
        return report.____();
    }
    
    public static void main(String[] args) {
        double[] testData = new double[10000];
        for (int i = 0; i < testData.length; i++) {
            testData[i] = Math.random() * 100;
        }
        
        long startWithoutOptimization = System.nanoTime();
        String reportWithoutOptimization = generateReportWithoutOptimization(testData);
        long endWithoutOptimization = System.nanoTime();
        
        long startWithOptimization = System.nanoTime();
        String reportWithOptimization = generateReportWithOptimization(testData);
        long endWithOptimization = System.nanoTime();
        
        System.out.println("Time taken without optimization: " + (endWithoutOptimization - startWithoutOptimization) / 1_000_000 + " ms");
        System.out.println("Time taken with optimization: " + (endWithOptimization - startWithOptimization) / 1_000_000 + " ms");
    }
}
编辑并运行代码