替换为空字符串替换原始字符串中所有字符周围的newChar

我正在处理我的一个Java代码,我在其中使用Java String.replace方法。 因此,在一种情况下测试替换方法时,我计划将String.replace("","");垃圾值放入String.replace("","");

所以在测试中我遇到了一个用其他值替换空值的条件,即String.replace("","p") ,它在原始字符串的所有字符周围替换"p"

例:

 String strSample = "val"; strSample = strSample.replace("","p"); System.out.println(strSample); 

输出:

 pvpaplp 

任何人都可以解释为什么它这样工作?

replace查找每个具有以替换字符串开头的String的位置。 例如,如果你在“香蕉”中替换“a”,它会发现“a”3次。

但是,对于空字符串,它会在任何地方找到它,包括最后一个字母之前和之后

以下是Java文档中针对您的案例的重载replace方法的定义。

String java.lang.String.replace(CharSequence target ,CharSequence replacement

将此字符串中与文字目标序列匹配的每个子字符串替换为指定的文字替换序列。 替换从字符串的开头到结尾,例如,在字符串“aaa”中将“aa”替换为“b”将导致“ba”而不是“ab”。

参数:
target要替换的char值序列
replacement char值的替换序列

现在,由于您将target定义为""即为空,因此它将选择字符串中的每个位置并将其替换为替换中定义的值。

值得注意的是,如果你使用strSample = strSample.replace(" ","p"); 这意味着一个空格字符作为target然后什么都不会被替换,因为现在在这种情况下, replace方法将尝试搜索空格字符。

本机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 */ 

看看这个例子:

 "" + "abc" + "" 

这段代码的结果是什么?
答:它仍然是"abc" 。 所以你看,我们可以说所有字符串前后都有一些空字符串。

同样的规则适用于像。之间的字符

 "a"+""+"b"+""+"c" 

仍将创建"abc"

所以字符之间也存在空字符串。

在你的代码中

 "val".replace("","p") 

所有这些空字符串用p替换,导致pvpaplp


""+""+..+""+""假设Java足够聪明,可以将其视为一个""