首先我们来看一段代码
public class StringTest {
public static void main(String[] args) {
String str = "ABCDE";
str.replace('A','F');
System.out.println(str);
}
}
执行输出结果如下:
ABCDE
我们发现虽然执行了str.replace(‘A’,‘F’),但是str中的A被替换为F,但是str的输出并没有改变。接着我们对代码进行修改:
public class StringTest {
public static void main(String[] args) {
String str = "ABCDE";
String replacedStr = str.replace('A','F');
System.out.println(replacedStr);
}
}
执行结果如下:
FBCDE
我们发现将str.replace(‘A’,‘F’)赋值给String replacedStr,才能得到我们想要的替换后的结果,这是为什么呢?我们来看看replace方法源码:
public String replace(char oldChar, char newChar) {
if (oldChar != newChar) {
int len = value.length;
int i = -1;
char[] val = value; /* avoid getfield opcode */
while (++i < len) {
if (val[i] == oldChar) {
break;
}
}
if (i < len) {
char buf[] = new char[len];
for (int j = 0; j < i; j++) {
buf[j] = val[j];
}
while (i < len) {
char c = val[i];
buf[i] = (c == oldChar) ? newChar : c;
i++;
}
return new String(buf, true);
}
}
return this;
}
源码中有一个return new String(buf, true),表示replace(char oldChar, char newChar)方法执行后返回的一个新的String类对象buf,至于原来的String类对象value是没有变。
总结replace方法:String类对象str执行replace方法后,str没做改变,执行replace方法后得到一个新的类,因此需要new一个新的String类对象replacedStr来承接replace方法的返回值。