Да, это имеет смысл, поскольку в Java используется пул строк, поэтому при создании строки без использования ключевого слова new до тех пор, пока обе ссылочные переменные совпадают, String == всегда будет истинным.
Скажем, у вас есть "" в вашем пуле строк, если вы делаете
String a = "";
String b = "";
Поскольку "" находится в пуле строк, они фактически будут указывать на одну и ту же область памяти и, следовательно,
a == b
будет правдой
На самом деле, пока вы не используете
String c = new String("");
Ссылочная переменная всегда будет указывать на "" в пуле строк.
Однако при использовании нового ключевого слова новое выделение памяти создается вне пула строк. Поэтому, если вы делаете:
c == b
Это вернет false, поскольку ссылка на b находится в пуле строк, а ссылка на c - нет, она находится вне пула
Однако, если бы мы сделали
String d = c.intern()
d == b
Это вернет true, то, что стажер делает в соответствии с комментариями к классу String,
Возвращает каноническое представление для строкового объекта.
Пул строк, изначально пустой, поддерживается частным образом классом String.
При вызове метода intern, если пул уже содержит строку, равную этому объекту String, как определено методом equals (Object), возвращается строка из пула. В противном случае этот объект String добавляется в пул и возвращается ссылка на этот объект String.
Из этого следует, что для любых двух строк s и t s.intern () == t.intern () имеет значение true, если и только если s.equals (t) имеет значение true.
Как уже указывалось некоторыми при десериализации объекта на другой JVM, он будет использовать этот пул строк JVM