代码案例
Msg msg = new Msg();
msg.setStr("^-^:小小少年真开心<input />,author:qinlei");
String str = msg.getStr();
str.replace('<', '[');
str.replace("/>","]");
msg.setStr(str);
System.out.println(msg);
结果仍然是
"^-^:小小少年真开心<input />,author:qinlei"
源码分析
打开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;
}
上述源码
由选择结构可知:
- 当oldChar == newChar时,即不进行替换操作,返回当前String对象
- 当oldChar != newChar时,即进行替换操作,此时返回的是新创建的String对象,而不是当前需要替换的字符串
结论
由此可知,当上述DEMO中,str.replace(’<’, ‘[’);操作返回的是一个新的字符串,而当前的str并没有改变,且String字符串创建后的对象不会改变,所以感官上看到的是替换操作replace失效!
更改后的代码
Msg msg = new Msg();
msg.setStr("^-^:小小少年真开心<input />,author:qinlei");
//msg中有段黑客代码 <input />
//需要将其屏蔽 这里进行替换操作
String str = msg.getStr();
str = str.replace('<', '[');
str = str.replace("/>","]");
msg.setStr(str);
System.out.println(msg);
此时,结果正常,符合预期