如何替换固定长度字符串中的字符?

时间:2015-02-27 09:12:11

标签: java

我想用固定字符替换特定位置之间的字符串内容。

是否有任何公共库(apache,guava)提供类似于以下伪代码的类?

string.replaceBetween(10, 20, "*");

如果没有,我怎样才能在性能方面做到最好?

2 个答案:

答案 0 :(得分:3)

以下方式怎么样?您可以在StringBuilder中使用replace()

String str = "hi, how are you?";
String alterStr=new StringBuilder(str).replace(4,6,"*").toString();
System.out.println(alterStr);

答案 1 :(得分:0)

这是一个简单的工具,

 public static String replace(String old  ,int begin, int end ,char oldChar ,char newChar ){
    if (oldChar != newChar) {
    char array[] = old.toCharArray();
    for(int i = begin;i<end;i++){
        if(old.charAt(i)==oldChar){
            array[i] = newChar;
        }
    }

    return new String(array);
    }
    return old;
}

它会创建一个新的char数组,然后根据需要更新数组中的每个项目。 可悲的是,它在构建新String时再次复制char数组。 但是,至少,本地数组将由GC清理。我认为这已经足够了,因为JDK1.6 String替换的原始代码(char oldChar,char newChar)也创建了 一个本地数组,如下所示,

public String replace(char oldChar, char newChar) {
if (oldChar != newChar) {
    int len = count;
    int i = -1;
    char[] val = value; /* avoid getfield opcode */
    int off = offset;   /* avoid getfield opcode */

    while (++i < len) {
    if (val[off + i] == oldChar) {
        break;
    }
    }
    if (i < len) {
    char buf[] = new char[len];
    for (int j = 0 ; j < i ; j++) {
        buf[j] = val[off+j];
    }
    while (i < len) {
        char c = val[off + i];
        buf[i] = (c == oldChar) ? newChar : c;
        i++;
    }
    return new String(0, len, buf);
    }
}
return this;
}  

如果您在StringBuffer中读取代码,您可以看到很多arrayCopy,所以我认为 表现不佳。