我正在处理我正在使用Java String.replace方法的一个java代码。因此,在一种情况下测试替换方法时,我计划将垃圾值设为String.replace("","");
所以在测试中,我遇到了用其他值替换空值的条件,即String.replace("","p")
在原始字符串的所有字符周围替换了"p"
示例:
String strSample = "val";
strSample = strSample.replace("","p");
System.out.println(strSample);
输出:
pvpaplp
任何人都可以解释为什么会这样吗?
答案 0 :(得分:5)
replace
查找您拥有以替换字符串开头的String的每个位置。例如如果你在“香蕉”中替换“a”,它会发现“a”3次。
但是,对于空字符串,它会在任何地方找到它,包括在最后一个字母之前和之后。
答案 1 :(得分:1)
以下是Java文档中针对您的案例的重载replace
方法的定义。
String java.lang.String.replace(CharSequence target ,CharSequence 的替换强>)
替换此字符串中与文字目标匹配的每个子字符串 具有指定文字替换序列的序列。该 替换从字符串的开头到结尾,为 例如,替换" aa"用" b"在字符串" aaa"会导致 " BA"而不是" ab"。
参数:
目标要替换的char值序列
替换 char值的替换序列
现在,由于您将target
值定义为""
,即为空,因此它会选择字符串中的每个位置,并将其替换为replacement
中定义的值。
值得注意的是,如果您使用strSample = strSample.replace(" ","p");
这意味着一个空格字符为target
值,则不会替换任何内容,因为现在在这种情况下replace
方法将会尝试搜索空格字符。
答案 2 :(得分:1)
本机Java java.lang.String
实现(如Ruby和Python)在执行字符串操作时将空字符串""
视为有效字符序列。因此,""
字符序列在两个字符之间实际上无处不在,包括在最后一个字符之前和之后。
它与所有java.lang.String
操作协调一致。见:
String abc = "abc";
System.out.println(abc.replace("", "a")); // aaabaca instead of "abc"
System.out.println(abc.indexOf("", "a")); // 0 instead of -1
System.out.println(abc.contains("", "a")); // true instead of false
作为旁注:
这种行为可能会产生误导,因为许多其他语言/实现的行为都不像这样。例如,SQL(MySQL,MSSQL,Oracle和PostgreSQL)和PHP不会将""
视为字符串替换的有效字符序列。 .NET进一步调用System.ArgumentException: String cannot be of zero length.
,例如调用abc.Replace("", "a")
。
即使是流行的Apache Commons Lang Java库也有不同的工作方式:
org.apache.commons.lang3.StringUtils.replace("abc", "", "a")); /* abc */
答案 3 :(得分:0)
看一下这个例子:
"" + "abc" + ""
此代码的结果是什么?
答:它仍然是"abc"
。所以你看,我们可以说所有字符串前后都有一些空字符串。
同样的规则适用于
之类的字符"a"+""+"b"+""+"c"
仍会创建"abc"
字符之间也存在空字符串。
在您的代码中
"val".replace("","p")
所有这些空字符串都替换为p
,导致pvpaplp
。
如果""+""+..+""+""
假设Java足够聪明,可以将其视为一个""
。