【问题标题】:Appending Strings vs appending chars in Java在 Java 中附加字符串与附加字符
【发布时间】:2013-11-29 23:00:38
【问题描述】:

我正在尝试解决速度至关重要的算法任务。在算法中,我在图表中使用 DFS 搜索,并且在每一步中,我添加一个字符和一个字符串。我不确定这是否是我算法的瓶颈(可能不是),但我很好奇最快、最有效的方法是什么。

目前,我使用这个:

transPred.symbol + word

我认为可能有比“+”运算符更好的替代方法,但大多数 String 方法仅适用于其他字符串(将我的 char 转换为 String 并使用其中一个会有所不同吗?)。

感谢您的回答。

编辑:

for (Transition transPred : state.transtitionsPred) {
            walk(someParameters, transPred.symbol + word);
        }

transPred.symbol 是一个字符,word 是一个字符串

【问题讨论】:

  • 为什么不直接使用 StringBuilder 或 StringBugger?它们专为此类问题而设计,以允许在循环中进行有效的字符串构造。
  • StringBugger 我当然是指 StringBuffer。 FML。

标签: java string micro-optimization


【解决方案1】:

一个非常常见的问题/担忧。

请记住,java 中的每个字符串都是不可变的。因此,如果您修改字符串,它实际上会创建一个新对象。这会为您在上面执行的每个串联生成一个新对象。这不是很好,因为它只是在创建必须在某个时候收集的垃圾。

如果您的图表过大,这可能是在您的遍历逻辑期间 - 它可能会减慢您的算法。

要避免为每个串联创建新字符串,请使用StringBuilder。您可以在循环之外声明一个,然后在每个字符后面附加StringBuilder.append(char)。这不会为每个 append() 操作创建新对象。

在您的循环之后,您可以使用StringBuilder.toString(),这创建一个新对象(字符串),但它只会是您整个循环的一个。

【讨论】:

  • 这仅在您重复添加到同一个字符串时才有帮助。如果您每次都生成不同的字符串,那将没有任何好处,因为 Java 编译器无论如何都会为您执行此操作。
  • 我需要在字符串的开头附加一个符号,但我不知道它将是哪个符号,因此生成的字符串总是不同的 - 我将编辑我的问题
  • 我编辑了我的问题......也许现在更清楚了......我正在寻找如何附加这两件事的省时方法
  • @Smaji - 如果您一次只添加一个符号,您仍然可以使用追加,然后在最后使用 StringBuilder.reverse(),在 StringBuilder.toString() 之前,这将颠倒顺序字符。
  • 他似乎每次迭代都需要不同的字符串
【解决方案2】:

由于您在每次迭代中替换字符串中的一个字符,我认为没有什么比简单的+ 追加操作更快的了。如前所述,字符串是不可变的,因此当您向其附加 char 时,您将获得一个新的 String 对象,但这在您的情况下似乎是不可避免的,因为您在每次迭代时都需要一个新字符串。

如果你真的想优化这部分,可以考虑使用可变的东西,比如字符数组。这将允许您替换第一个字符而无需创建任何过多的对象。

另外,当你说这可能不是你的瓶颈时,我认为你是对的。请记住,过早的优化是 root of all evil 等。(不要介意最流行的良好优化示例是避免过多的字符串连接具有讽刺意味)。

【讨论】:

  • 使用某种字符列表而不是字符串会更快吗?
  • 这将允许您重用相同的元素,所以它绝对是一个选择。如果您需要在某个时候将其转换为字符串,那么它可能不会有太大的不同。
  • @Smajl 我添加了一些关于它的文字
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
相关资源
最近更新 更多