java - 弦乐与表演

标签 java string performance

我有一个这样的 for 循环:

    String myString = "123456789";
    String prefix = null;
    for (int i=6;i>=0;--i)
    {
       prefix = myString.substring(0,i);
       process(prefix);
    }

问题是,如果这段代码被执行N次,将会创建N*7个字符串(每次执行都会创建7个字符串——因为substring方法创建了一个新的String并且这个方法被调用了7次每次执行)。 我正在考虑如何在这种情况下提高性能。我想知道是否有一种方法每次执行只使用一个字符串,每次都修改它。这就是 StringBuilder 的目的,但我认为 StringBuilder 在这种情况下没有帮助:

    String myString = "123456789";
    StringBuilder prefix = new StringBuilder(myString);
    for (int i=6;i>=0;--i)
    {
       prefix.delete(i,prefix.length());
       process(prefix.toString());
    }

在这种情况下,prefix 总是引用同一个 StringBuilder 对象,但同样的问题出现在另一个地方,因为 prefix.toString() 总是返回一个新的 String 对象。

有什么想法吗?

(我知道这个话题已经被处理过很多次了。但是我已经做了一些搜索,但我没有找到解决方案,也许这是内存的最小使用?)

谢谢你的帮助

最佳答案

虽然 myString.substring(0, i) 确实创建了一个新的 String 对象,但请注意,这不会复制底层字符数据。

在对这段代码做任何事情之前,我会使用分析器来验证这确实是一个瓶颈(无论是在 CPU 使用方面,还是在垃圾收集器的压力方面)。

关于java - 弦乐与表演,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7822285/

相关文章:

java - 在任何情况下,通过 DAO 模式中的构造函数传递的连接都会不安全吗?

java - 简单的父子 Java 应用程序

将对象从 Android 发送到 Java 服务器时,ObjectInputStream.readObject() 上出现 Java.lang.ClassNotFoundException

javascript - 如何通过字符差异作为分隔符来拆分字符串?

java - 我怎样才能剪断这根绳子?

c# - 列出所有 "A"的字符串

mysql查询以有效地删除重复项

c# - 为什么在取消大量 HTTP 请求时取消会阻塞这么长时间?

java - 无法从数据库检索数据,但当名称更改时我可以检索

algorithm - 查找具有相似产品的类别-低效率-转到