偶尔看了下String类的源码,发现replace方法replace(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;
    }感觉写的比较麻烦,个人感觉好多代码可以不写.为什么替换不在第一个while找到oldchar的时候就替换了。而要放到下面来做?

解决方案 »

  1.   

    关键在于在Java语言的规范中,String对象内包含的字符串是不能变的,你用replace等函数得到的是一个新的字符串对象。如果你在第一个while中直接修改val数组的值的话就修改了原来的字符串了
      

  2.   

    如果一定要放进去的话,那么buf必须是在while之前创建,然后逐个字符进行处理,如果不要替换的直接复制,否则将新的字符放到buf的对应位置
      

  3.   

    关键在于在Java语言的规范中,String对象内包含的字符串是不能变的---???是jsr,有中文版吗?我觉得你说的方法可行.不知道为什么源码中要做第一次while的判断,就为了判断是否有oldchar?
      

  4.   

    这个CSDN代码贴上来都没有格式了仔细看了下,他这样做的好处在于可以首先判断出字符串中有没有需要替换的字符,如果没有,就不需要创建新的数组去处理了,直接返回this(本对象)。如果有才需要进一步处理。
    而上面我说过的方法不管有没有需要替换的字符,都会复制一次。在没有字符需要替换的情况下,效率比较低,而且返回的不是本对象的引用
      

  5.   

    第一次while是为了定位oldchar出现的位置,即执行完以后i的值。。