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

2022-09-02 23:48:55

考虑:

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

这些额外的空间来自哪里?


答案 1

它不是一个空间。这是 IDE/控制台显示 \0 字符的方式,默认情况下会填充该字符。new char[10]

你没有用任何东西替换,所以它保持在字符串中。相反,您只替换空字符串。重要的是,Java假设它存在于:\0.replace("", "hello")""""

  • 字符串的开头,
  • 字符串的末尾,
  • 和每个角色之间

因为我们可以使用:"abc"

"abc" = "" + "a" + "" + "b" + "" + "c" + ""`;
      //^          ^          ^          ^

现在将每个替换为 ,因此对于长度为 10 的字符串,它将放置额外的 11 秒(而不是 10),而不进行修改 ,这将在输出处显示为空格。.replace("", "hello")"""hello"hello\0


也许这会更容易掌握:

System.out.println("aaa".replace("", "X"));
  • 让我们用 .我们将得到(注意,有 4""|"|a|a|a|"|)
  • 因此替换为将导致(但在您的情况下,而不是您的控制台将使用看起来像空格的字符进行打印)""X"XaXaXaX"a\0

答案 2

简短版本

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

长版

  1. 当您尝试创建一个空的 ,:Stringchar[10]

    String input = new String(new char[10]);
    

    此遗嘱包含 10 个字符:StringNUL

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

    |hello|hello|hello|hello|hello|hello|hello|hello|hello|hello|
    
  3. 当您调用 时,该值不会被替换,因为它与空字符串不匹配:input.replace("", "hello")NUL""

    |hello|NUL|hello|NUL|hello|NUL|hello|NUL|hello|NUL|hello|NUL|hello|NUL|hello|NUL|hello|NUL|hello|NUL|hello|