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
#2
论坛没人吗。。。
#3
因为有可能char数组中没有oldChar 这样就没必要循环了
#4
其实没得必要去纠结,每个人的想法不一样
你仔细想想代码就知道了
如果原始字符串是a,现在想要把a替换成为b
即调用replace('a','b')方法,你在看看你的代码是否有不妥之处呢?
你仔细想想代码就知道了
如果原始字符串是a,现在想要把a替换成为b
即调用replace('a','b')方法,你在看看你的代码是否有不妥之处呢?
#5
没看出来有什么不妥的地方,可以指出来吗
#7
目测是为了避免创建重复的字符串对象,你那样就算字符串里不包含要replace的字符,还是会创建一个新字符串,这有违String类的设计原则,尽量避免创建两个内容相同的字符串。
#8
就一个目的: 为了快
#9
节省内存,少创建很多对象
#10
如何编写replace方法呢
#1
#2
论坛没人吗。。。
#3
因为有可能char数组中没有oldChar 这样就没必要循环了
#4
其实没得必要去纠结,每个人的想法不一样
你仔细想想代码就知道了
如果原始字符串是a,现在想要把a替换成为b
即调用replace('a','b')方法,你在看看你的代码是否有不妥之处呢?
你仔细想想代码就知道了
如果原始字符串是a,现在想要把a替换成为b
即调用replace('a','b')方法,你在看看你的代码是否有不妥之处呢?
#5
没看出来有什么不妥的地方,可以指出来吗
#6
关键是理解那段注释:/* avoid getfield opcode */
参考: avoid getfield opcode
参考: avoid getfield opcode
#7
目测是为了避免创建重复的字符串对象,你那样就算字符串里不包含要replace的字符,还是会创建一个新字符串,这有违String类的设计原则,尽量避免创建两个内容相同的字符串。
#8
就一个目的: 为了快
#9
节省内存,少创建很多对象
#10
如何编写replace方法呢