Функция предварительного просмотра JDK 13: Textblock возвращает false для равенства и ==. Зависимы ли пробелы табуляции?
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);
}
}
Что мне не хватает?
1 ответ
Решение
Сделаем String
короче.
String jsonLiteral = ""
+ "{\n"
+ "\tgreeting: \"Hello\"\n"
+ "}\n";
String jsonBlock = """
{
greeting: "Hello"
}
""";
Давайте отладим их и распечатаем их фактическое содержимое.
"{\n\tgreeting: \"Hello\"\n}\n"
"{\n greeting: \"Hello\"\n}\n"
\t
а также " "
(четыре символа ASCII SP или четыре пробела) не равны, как и все String
с. Как вы могли заметить, отступ в текстовом блоке был образован пробелами (не горизонтальными табуляциями, каналами форм или любыми другими символами, похожими на пробелы).
Вот несколько примеров текстовых блоков из спецификации 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
, хотя рассчитывать на последнее не стоит.
Читать:
Связанные с: