在Java中附加字符串与附加字符

时间:2013-11-29 23:00:38

标签: java string micro-optimization

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

目前,我用这个:

transPred.symbol + word

我认为可能有比“+”运算符更好的替代方法,但大多数String方法只能与其他字符串一起使用(将我的char转换为String并使用其中一个产生差异?)。

感谢您的回答。

编辑:

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

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

2 个答案:

答案 0 :(得分:1)

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

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

如果你的图形过大,这可能是在你的遍历逻辑中 - 它可能会降低你的算法速度。

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

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

答案 1 :(得分:1)

由于在每次迭代时替换字符串中的一个char,我认为没有比简单的+追加操作更快的速度。如上所述,字符串是不可变的,所以当你向它追加一个字符时,你会得到一个新的String对象,但在你的情况下这似乎是不可避免的,因为你需要在每次迭代时都有一个新的字符串。

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

另外,当你说这可能不是你的瓶颈时,我认为你是对的。并且请记住,过早优化是{{​​3}}等。(请注意,最流行的优化优化示例是避免过多的字符串连接。)