关于String类中replace方法的源代码的疑惑

时间:2021-08-28 20:04:25
看了String类的源代码,其中对public String 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;
    }

为什么要先找到第一个可以替换的位置?直接使用循环进行替换不行吗,我写的话应该是这样的:
    public String replace(char oldChar, char newChar) {
if (oldChar != newChar) {
    int len = count;
    int i = 0;
    char[] val = value; /* avoid getfield opcode */
    int off = offset;   /* avoid getfield opcode */
    char buf[] = new char[len];

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

对于jdk中的源码不理解,求解释!

10 个解决方案

#1


该回复于2014-08-04 13:01:05被管理员删除

#2


论坛没人吗。。。

#3


因为有可能char数组中没有oldChar  这样就没必要循环了

#4


其实没得必要去纠结,每个人的想法不一样
你仔细想想代码就知道了
如果原始字符串是a,现在想要把a替换成为b
即调用replace('a','b')方法,你在看看你的代码是否有不妥之处呢?

#5


引用 4 楼 zy353003874 的回复:
其实没得必要去纠结,每个人的想法不一样
你仔细想想代码就知道了
如果原始字符串是a,现在想要把a替换成为b
即调用replace('a','b')方法,你在看看你的代码是否有不妥之处呢?

没看出来有什么不妥的地方,可以指出来吗

#6


关键是理解那段注释:/* avoid getfield opcode */
参考: avoid getfield opcode

#7


目测是为了避免创建重复的字符串对象,你那样就算字符串里不包含要replace的字符,还是会创建一个新字符串,这有违String类的设计原则,尽量避免创建两个内容相同的字符串。

#8


就一个目的: 为了快

#9


节省内存,少创建很多对象

#10


如何编写replace方法呢

#1


该回复于2014-08-04 13:01:05被管理员删除

#2


论坛没人吗。。。

#3


因为有可能char数组中没有oldChar  这样就没必要循环了

#4


其实没得必要去纠结,每个人的想法不一样
你仔细想想代码就知道了
如果原始字符串是a,现在想要把a替换成为b
即调用replace('a','b')方法,你在看看你的代码是否有不妥之处呢?

#5


引用 4 楼 zy353003874 的回复:
其实没得必要去纠结,每个人的想法不一样
你仔细想想代码就知道了
如果原始字符串是a,现在想要把a替换成为b
即调用replace('a','b')方法,你在看看你的代码是否有不妥之处呢?

没看出来有什么不妥的地方,可以指出来吗

#6


关键是理解那段注释:/* avoid getfield opcode */
参考: avoid getfield opcode

#7


目测是为了避免创建重复的字符串对象,你那样就算字符串里不包含要replace的字符,还是会创建一个新字符串,这有违String类的设计原则,尽量避免创建两个内容相同的字符串。

#8


就一个目的: 为了快

#9


节省内存,少创建很多对象

#10


如何编写replace方法呢