考虑:
System.out.println(new String(new char[10]).replace("\0", "hello"));
具有输出:
hellohellohellohellohellohellohellohellohellohello
但是:
System.out.println(new String(new char[10]).replace("", "hello"));
具有输出:
hello hello hello hello hello hello hello hello hello hello
这些多余的空间从哪里来?
答案 0 :(得分:15)
这不是空格。这是您的IDE /控制台 显示 的方式\0
字符,默认情况下填充new char[10]
。
您没有将\0
替换为任何内容,因此它保持字符串形式。而是使用.replace("", "hello")
来替换仅空字符串""
。重要的是Java假定""
存在于以下位置:
因为我们可以通过以下方式获得"abc"
:
"abc" = "" + "a" + "" + "b" + "" + "c" + ""`;
//^ ^ ^ ^
现在.replace("", "hello")
用""
替换每个"hello"
,因此对于长度为10的字符串,它将放置另外的 11 hello
s(而不是 10 ),而无需修改\0
,它会在您的输出中像空格一样显示。
也许这会更容易理解:
System.out.println("aaa".replace("", "X"));
""
表示每个|
。我们将得到"|a|a|a|"
(注意,有4个|
)""
替换为X
会得到"XaXaXaX"
(但在您的情况下,控制台将使用看起来像这样的字符打印a
而不是\0
像空间)答案 1 :(得分:12)
\0
代表字符NUL
,它不等于空字符串""
。
当您尝试创建带有空String
的{{1}}时,:
char[10]
此String input = new String(new char[10]);
将包含10个String
字符:
NUL
调用|NUL|NUL|NUL|NUL|NUL|NUL|NUL|NUL|NUL|NUL|
时,input.replace("\0", "hello")
值(NUL
)将替换为\0
:
hello
调用|hello|hello|hello|hello|hello|hello|hello|hello|hello|hello|
时,input.replace("", "hello")
值将不被替换,因为它与空字符串NUL
不匹配:
""
答案 2 :(得分:8)
您正在使用方法String#replace(CharSequence target, CharSequence replacement)
(documentation)。
如果使用空目标字符序列replace("", replacement)
调用,它将不替换源中的元素,但插入 替换 >在每个字符之前。
这是因为""
与字符之间的位置匹配,而不是字符本身。因此,将替换之间的每个位置,即插入 replacement 。
示例:
"abc".replace("", "d") // Results in "dadbdcd"
您的字符串在每个位置仅包含默认值char
,
\0\0\0\0\0\0\0\0\0\0
使用该方法会导致:
hello\0hello\0hello\0hello\0hello\0hello\0hello\0hello\0hello\0hello\0
您的控制台可能将字符\0
显示为空白,而实际上不是空白,而是\0
。
如果我在其他控制台中尝试您的代码,则会得到:
确认字符确实不是空格,而是其他内容(即\0
)。
答案 3 :(得分:3)
\u0000
的默认值为\0
,也可以表示为new char[10]
。因此,您的\0
包含10个\0
。
在第一条语句中,您显然将"hello"
替换为RewriteCond %{HTTP_HOST} ^74\.127\.128\.193$
RewriteRule ^(.*)$ http://google.com/$1 [L,R=301]
。但是在第二条语句中,您忽略了默认值。您的IDE输出选择显示为空格的那个。