字符串replace()返回Java中的额外空间

时间:2018-08-18 16:02:57

标签: java string replace char

考虑:

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

这些多余的空间从哪里来?

4 个答案:

答案 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"));
  • let用""表示每个|。我们将得到"|a|a|a|"(注意,有4个|
  • 因此将""替换为X会得到"XaXaXaX"(但在您的情况下,控制台将使用看起来像这样的字符打印a而不是\0像空间)

答案 1 :(得分:12)

简短版

\0代表字符NUL,它不等于空字符串""

长版

  1. 当您尝试创建带有空String的{​​{1}}时,:

    char[10]

    String input = new String(new char[10]); 将包含10个String字符:

    NUL
  2. 调用|NUL|NUL|NUL|NUL|NUL|NUL|NUL|NUL|NUL|NUL| 时,input.replace("\0", "hello")值(NUL)将替换为\0

    hello
  3. 调用|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

如果我在其他控制台中尝试您的代码,则会得到:

enter image description here

确认字符确实不是空格,而是其他内容(即\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输出选择显示为空格的那个。