Android String.format() 引发的卡顿问题

String.format() 是 Java 中用于创建格式化字符串的方法,Android 作为基于 Java 的平台,同样提供了这个功能。这个方法允许我们构建一个带有占位符的字符串,然后将这些占位符替换为具体的值。

String.format() 方法的用法与 printf() 在 C 语言中的用法十分相似。我们可以指定字符串中的每一个占位符的格式,比如:整数、浮点数、字符串等,然后通过 String.format() 的参数传递实际的值来替换这些占位符。

一个简单的使用实例:

String name = "张三";
int age = 25;
String formattedString = String.format("我的名字是 %s,我今年 %d 岁。", name, age);
System.out.println(formattedString);  // 我的名字是 张三,我今年 25 岁。

最近在检测应用的性能时,发现在短时间内大量调用 String.format() 时会引发卡顿,所以马上进入源码看看有没有哪里能够优化的


    public static String format(String format, Object... args) {
        return new Formatter().format(format, args).toString();
    }

比较简单,String.format() 方法中 new 了一个 Formatter 然后调用里面的函数

package java.util;

public final class Formatter implements Closeable, Flushable {
    private Appendable a;

    public Formatter() {
        this(Locale.getDefault(Locale.Category.FORMAT), new StringBuilder());
    }

    public Formatter(Appendable a) {
        this(Locale.getDefault(Locale.Category.FORMAT), nonNullAppendable(a));
    }

    private Formatter(Locale l, Appendable a) {
        this.a = a;
        // ...
    }
}

Formatter 类中的无参构造函数中是直接 new 了一个 StringBuilder,而这个 StringBuilder 承接了整个 format 流程的产物进行拼接,最后调用 toString 输出


在这里我们可以知道,在短时间内大量的调用 String.format() 方法,Formatter 和 StringBuilder 对象会不停得创建,那么优化方案就水落石出了(将 Formatter 和 StringBuilder 对象往外提)

object FormatUtils {
    private val stringBuilder by lazy { StringBuilder() }
    private val formatter by lazy { Formatter(stringBuilder) }

    fun format(formatString: String, vararg value: String): String {
        stringBuilder.setLength(0)
        formatter.format(formatString, value)
        return stringBuilder.toString()
    }
}

需要注意的是,上述优化可能在处理少量的简单字符串时并不会明显提升性能。而对于大量或复杂的字符串操作,应用这些方法才能带来显著的性能提升。如何优化取决于具体的使用场景和性能需求。

相关推荐

  1. Android imageView.setImageXXX() 引发问题

    2024-02-01 23:30:02       50 阅读
  2. Android String.format() 引发问题

    2024-02-01 23:30:02       54 阅读
  3. UI问题

    2024-02-01 23:30:02       60 阅读
  4. [Unity]播放音频问题

    2024-02-01 23:30:02       29 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-01 23:30:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-01 23:30:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-01 23:30:02       82 阅读
  4. Python语言-面向对象

    2024-02-01 23:30:02       91 阅读

热门阅读

  1. Vue2项目中实现头像上传

    2024-02-01 23:30:02       54 阅读
  2. C# 递归执行顺序

    2024-02-01 23:30:02       50 阅读
  3. C#面:sealed修饰符有什么特点

    2024-02-01 23:30:02       52 阅读
  4. mybatis一对多查询,list中的泛型是包装类

    2024-02-01 23:30:02       48 阅读
  5. DynamoDB 的 LSI 和 GSI 有什么区别?

    2024-02-01 23:30:02       53 阅读
  6. Linux

    Linux

    2024-02-01 23:30:02      48 阅读
  7. 每日OJ题_算法_前缀和⑦_力扣525. 连续数组

    2024-02-01 23:30:02       74 阅读
  8. c++ sort解释

    2024-02-01 23:30:02       42 阅读
  9. MySQL造数方法

    2024-02-01 23:30:02       59 阅读
  10. pgsql中in 和 join 怎么选

    2024-02-01 23:30:02       44 阅读
  11. Android C++生成complier_command.json

    2024-02-01 23:30:02       64 阅读