是否可以更快地替换Java String中的方法?

ojb*_*ass 14 java replace

replace方法返回一个字符串对象而不是替换给定字符串的内容这一事实有点迟钝(但是当你知道字符串在Java中是不可变的时,这是可以理解的).通过在某些代码中使用深层嵌套替换,我获得了重大的性能提升.有什么我可以用它取代它会使它更快吗?

pax*_*blo 22

这就是StringBuilder的用途.如果您要进行大量操作,请在a上进行操作StringBuilder,然后String在需要时将其转换为a .

StringBuilder 这样描述:

"一个可变的字符序列.这个类提供了与StringBuffer兼容的API,但不保证同步".

它有replace(和append,insert,delete,等),你可以用toString它演变成一个真正的String.


Dav*_*uls 8

以前的帖子是对的,StringBuilder/StringBuffer是一个解决方案.

但是,您还必须质疑在内存中对大字符串进行替换是否是个好主意.

我经常将String操作实现为流,因此我不是在字符串中替换它然后将其发送到OutputStream,而是在我将String发送到输出流时进行替换.这比任何替换都快得多.

如果您希望此替换实现模板机制,则此工作速度要快得多.流式传输总是更快,因为您消耗更少的内存,如果客户端速度慢,您只需要以慢速生成 - 因此它可以更好地扩展.

  • 你能提供一个例子吗? (2认同)

Hor*_*ux7 6

以下代码是约.如果没有匹配则快30倍,如果匹配则快5倍.

static String fastReplace( String str, String target, String replacement ) {
    int targetLength = target.length();
    if( targetLength == 0 ) {
        return str;
    }
    int idx2 = str.indexOf( target );
    if( idx2 < 0 ) {
        return str;
    }
    StringBuilder buffer = new StringBuilder( targetLength > replacement.length() ? str.length() : str.length() * 2 );
    int idx1 = 0;
    do {
        buffer.append( str, idx1, idx2 );
        buffer.append( replacement );
        idx1 = idx2 + targetLength;
        idx2 = str.indexOf( target, idx1 );
    } while( idx2 > 0 );
    buffer.append( str, idx1, str.length() );
    return buffer.toString();
}
Run Code Online (Sandbox Code Playgroud)


Jer*_*emy 5

我同意以上所述.使用单个线程时,使用StringBuffer进行线程安全和StringBuilder.