修改现有字符串的最佳方法是什么?StringBuilder还是转换为char数组并返回字符串?

use*_*963 7 java string

我正在学习Java,我想知道在这里修改字符串的最佳方法是什么(性能和学习Java中的首选方法).假设您循环遍历字符串并检查每个字符/对字符串中的索引执行某些操作.

我是否使用StringBuilder该类,或将字符串转换为char数组,进行修改,然后将char数组转换回字符串?

示例StringBuilder:

StringBuilder newString = new StringBuilder(oldString);
for (int i = 0; i < oldString.length() ; i++) {
    newString.setCharAt(i, 'X');    
}
Run Code Online (Sandbox Code Playgroud)

char数组转换的示例:

char[] newStringArray = oldString.toCharArray();
for (int i = 0; i < oldString.length() ; i++) {
    myNameChars[i] = 'X';    
}    
myString = String.valueOf(newStringArray);
Run Code Online (Sandbox Code Playgroud)

每种不同方式的优缺点是什么?

我认为这样StringBuilder会更有效率,因为每次更新索引时转换为char数组都会生成数组的副本.

Dan*_*lan 4

我说做任何最可读/可维护的事情,直到你知道字符串“修改”正在减慢你的速度。对我来说,这是最具可读性的:

Sting s = "foo";
s += "bar";
s += "baz";
Run Code Online (Sandbox Code Playgroud)

如果这太慢,我会使用StringBuilder. 您可能想将其与 进行比较StringBuffer。如果性能很重要而同步不重要,StringBuilder则应该更快。如果需要同步,那么您应该使用StringBuffer.

另外,重要的是要知道这些字符串没有被修改。在java中,Strings是不可变的。


这都是特定于上下文的。如果您优化此代码并且没有产生明显的差异(通常是这种情况),那么您只是想得比您需要的时间长,并且可能使您的代码更难以理解。当您需要时进行优化,而不是因为您可以。在执行此操作之前,请确保您正在优化的代码是导致性能问题的原因。

  • @MikeStrobel我一直认为它*应该*这样做。一直都是这样吗?如果无论如何使用“StringBuilder”,为什么还需要存在? (2认同)