问:下面代码的输出是什么?
String name = "abcabc";
name.replace("b", "a");
System.out.println(name);
答:输出结果是
abcabc
因为 String 的 replace 方法是新创建字符串的替换,具体参见如下源码:
public String replace(CharSequence target, CharSequence replacement) {
//两个参数都不能为空
if (target == null) {
throw new NullPointerException("target == null");
}
if (replacement == null) {
throw new NullPointerException("replacement == null");
}
//替换和被替换的字符串
String replacementStr = replacement.toString();
String targetStr = target.toString();
......
// This is the "regular" case.
int lastMatch = 0;
StringBuilder sb = null;
for (;;) {
int currentMatch = indexOf(this, targetStr, lastMatch);
if (currentMatch == -1) {
break;
}
//新建
if (sb == null) {
sb = new StringBuilder(len);
}
sb.append(this, lastMatch, currentMatch);
sb.append(replacementStr);
lastMatch = currentMatch + targetStr.length();
}
if (sb != null) {
//返回替换后的新字符串
sb.append(this, lastMatch, len);
return sb.toString();
} else {
return this;
}
}
问:下面代码的输出是什么?
String names = "a|b|c";
String[] ret1 = names.split("|");
System.out.println(ret1.length);
答:输出结果是 5。
因为 split 方法接收的参数是一个正则表达式字符串,而 |
在正则表达式里是个特殊字符,具备特殊的意义,或者表示正则匹配中的或,比如 ",|;"
正则用来匹配 ,
或 ;
,"|"
等同于 ""
,这里要想正确 split 需要写为 "\\|"
或 "[|]"
即可。
特别注意,split(reg)
方法是根据匹配给定的正则表达式来拆分字符串,reg
取值特别注意 .
、
|
和 *
等转义字符的问题,遇到这些正则表达式转义字符务必添加 \\
转义。