我想用固定字符替换特定位置之间的字符串内容。
是否有任何公共库(apache,guava)提供类似于以下伪代码的类?
string.replaceBetween(10, 20, "*");
如果没有,我怎样才能在性能方面做到最好?
答案 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,所以我认为 表现不佳。