-3

equals==返回false文本块字符串,尽管它们在控制台中打印相同。

public class Example {
    public static void main(String[] args) {
        String jsonLiteral = ""
                + "{\n"
                + "\tgreeting: \"Hello\",\n"
                + "\taudience: \"World\",\n"
                + "\tpunctuation: \"!\"\n"
                + "}\n";

        String jsonBlock = """
                {
                    greeting: "Hello",
                    audience: "World",
                    punctuation: "!"
                }
                """;

        System.out.println(jsonLiteral.equals(jsonBlock)); //false
        System.out.println(jsonBlock == jsonLiteral);
    }
}

我错过了什么?

4

1 回答 1

1

让我们String缩短 s。

String jsonLiteral = ""
        + "{\n"
        + "\tgreeting: \"Hello\"\n"
        + "}\n";

String jsonBlock = """
        {
            greeting: "Hello"
        }
        """;

让我们调试它们并打印它们的实际内容。

"{\n\tgreeting: \"Hello\"\n}\n"
"{\n    greeting: \"Hello\"\n}\n"

\tand " "(四个 ASCII SP 字符或四个空格)不相等,整个Strings 也不相等。您可能已经注意到,文本块中的缩进是由空格形成的(不是由水平制表符、换页符或任何其他类似空白的字符)。

以下是JEP 355 规范中的一些文本块示例:

String season = """
                winter""";    // the six characters w i n t e r

String period = """
                winter
                """;          // the seven characters w i n t e r LF

String greeting = 
    """
    Hi, "Bob"
    """;        // the ten characters H i , SP " B o b " LF

String salutation =
    """
    Hi,
     "Bob"
    """;        // the eleven characters H i , LF SP " B o b " LF

String empty = """
               """;      // the empty string (zero length)

String quote = """
               "
               """;      // the two characters " LF

String backslash = """
                   \\
                   """;  // the two characters \ LF

在你的情况下,

String jsonBlock = """
          {
              greeting: "Hello"
          }
          """; // the 26 characters { LF SP SP SP SP g r e e t i n g : SP " H e l l o " LF } LF

要使它们相等,请替换"\t"" "。两者都equals应该==返回true,尽管你不应该依赖后者。


读书:

  1. JEP 355 规范:文本块(预览版)

有关的:

  1. 如何在文本块中处理意图(Java 13)

  2. 非法文本块打开分隔符序列,缺少行终止符

于 2019-09-27T20:49:34.157 回答