我正在尝试解决速度至关重要的算法任务。在算法中,我在图中使用DFS搜索,在每一步中,我都添加了一个char和一个String。我不确定这是否是我的算法的瓶颈(可能不是),但我很好奇什么是最快和最有效的方法。
目前,我用这个:
transPred.symbol + word
我认为可能有比“+”运算符更好的替代方法,但大多数String方法只能与其他字符串一起使用(将我的char转换为String并使用其中一个产生差异?)。
感谢您的回答。
编辑:
for (Transition transPred : state.transtitionsPred) {
walk(someParameters, transPred.symbol + word);
}
transPred.symbol
是一个字符,word
是一个字符串
答案 0 :(得分:1)
一个非常常见的问题/担忧。
请记住,java中的每个String都是不可变的。因此,如果您修改字符串,它实际上会创建一个新对象。这会为您在上面执行的每个连接生成一个新对象。这不是很好,因为它只是创建垃圾,必须在某些时候收集。
如果你的图形过大,这可能是在你的遍历逻辑中 - 它可能会降低你的算法速度。
要避免为每个串联创建新字符串,请使用StringBuilder
。您可以在循环外声明一个,然后使用StringBuilder.append(char)
附加每个字符。这不会导致为每个append()
操作创建新对象。
在循环之后你可以使用StringBuilder.toString()
,这个将创建一个新对象(字符串),但它只是整个循环的一个。
答案 1 :(得分:1)
由于在每次迭代时替换字符串中的一个char,我认为没有比简单的+
追加操作更快的速度。如上所述,字符串是不可变的,所以当你向它追加一个字符时,你会得到一个新的String对象,但在你的情况下这似乎是不可避免的,因为你需要在每次迭代时都有一个新的字符串。
如果你真的想要优化这个部分,可以考虑使用像chars数组一样可变的东西。这将允许您替换第一个字符而不会创建任何过多的对象。
另外,当你说这可能不是你的瓶颈时,我认为你是对的。并且请记住,过早优化是{{3}}等。(请注意,最流行的优化优化示例是避免过多的字符串连接。)